Skip to content

Commit 45bdd0a

Browse files
Changes after review
1 parent 0cc4b3a commit 45bdd0a

File tree

6 files changed

+167
-42
lines changed

6 files changed

+167
-42
lines changed

pkg/acceptance/bettertestspoc/assert/resourceshowoutputassert/listings_datasource_show_output_ext.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import (
77
)
88

99
// ListingsDatasourceShowOutput is a temporary workaround to have better show output assertions in data source acceptance tests.
10-
func ListingsDatasourceShowOutput(t *testing.T, name string) *ListingShowOutputAssert {
10+
func ListingsDatasourceShowOutput(t *testing.T, datasourceReference string) *ListingShowOutputAssert {
1111
t.Helper()
1212

1313
l := ListingShowOutputAssert{
14-
ResourceAssert: assert.NewDatasourceAssert("data."+name, "show_output", "listings.0."),
14+
ResourceAssert: assert.NewDatasourceAssert(datasourceReference, "show_output", "listings.0."),
1515
}
1616
l.AddAssertion(assert.ValueSet("show_output.#", "1"))
1717
return &l

pkg/datasources/listings.go

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import (
44
"context"
55

66
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/internal/provider"
7-
providerdatasources "github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/provider/datasources"
7+
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/provider/datasources"
8+
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/provider/previewfeatures"
89
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/resources"
910
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/schemas"
1011
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/sdk"
@@ -47,33 +48,19 @@ var listingsSchema = map[string]*schema.Schema{
4748

4849
func Listings() *schema.Resource {
4950
return &schema.Resource{
50-
ReadContext: TrackingReadWrapper(providerdatasources.Listings, ReadListings),
51+
ReadContext: PreviewFeatureReadWrapper(string(previewfeatures.ListingsDatasource), TrackingReadWrapper(datasources.Listings, ReadListings)),
5152
Schema: listingsSchema,
5253
Description: "Data source used to get details of filtered listings. Filtering is aligned with the current possibilities for SHOW LISTINGS query (`like`, `starts_with`, and `limit` are supported). The results of SHOW and DESCRIBE are encapsulated in one output collection.",
5354
}
5455
}
5556

5657
func ReadListings(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
5758
client := meta.(*provider.Context).Client
58-
req := sdk.NewShowListingRequest()
59+
req := new(sdk.ShowListingRequest)
5960

60-
if v, ok := d.GetOk("like"); ok {
61-
req.WithLike(sdk.Like{Pattern: sdk.String(v.(string))})
62-
}
63-
if v, ok := d.GetOk("starts_with"); ok {
64-
req.WithStartsWith(v.(string))
65-
}
66-
if v, ok := d.GetOk("limit"); ok {
67-
l := v.([]any)[0].(map[string]any)
68-
limit := sdk.LimitFrom{}
69-
if rv, ok := l["rows"]; ok {
70-
limit.Rows = sdk.Int(rv.(int))
71-
}
72-
if fv, ok := l["from"]; ok {
73-
limit.From = sdk.String(fv.(string))
74-
}
75-
req.WithLimit(limit)
76-
}
61+
handleLike(d, &req.Like)
62+
handleStartsWith(d, &req.StartsWith)
63+
handleLimitFrom(d, &req.Limit)
7764

7865
listings, err := client.Listings.Show(ctx, req)
7966
if err != nil {

pkg/provider/previewfeatures/preview_features.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const (
5151
ImageRepositoriesDatasource feature = "snowflake_image_repositories_datasource"
5252
JobServiceResource feature = "snowflake_job_service_resource"
5353
ListingResource feature = "snowflake_listing_resource"
54+
ListingsDatasource feature = "snowflake_listings_datasource"
5455
ManagedAccountResource feature = "snowflake_managed_account_resource"
5556
MaterializedViewResource feature = "snowflake_materialized_view_resource"
5657
MaterializedViewsDatasource feature = "snowflake_materialized_views_datasource"
@@ -129,6 +130,7 @@ var allPreviewFeatures = []feature{
129130
FunctionSqlResource,
130131
FunctionsDatasource,
131132
JobServiceResource,
133+
ListingsDatasource,
132134
ManagedAccountResource,
133135
MaterializedViewResource,
134136
MaterializedViewsDatasource,

pkg/provider/previewfeatures/preview_features_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ func Test_StringToFeature(t *testing.T) {
5050
{input: "snowflake_image_repositories_datasource", want: ImageRepositoriesDatasource},
5151
{input: "snowflake_job_service_resource", want: JobServiceResource},
5252
{input: "snowflake_listing_resource", want: ListingResource},
53+
{input: "snowflake_listings_datasource", want: ListingsDatasource},
5354
{input: "snowflake_managed_account_resource", want: ManagedAccountResource},
5455
{input: "snowflake_materialized_view_resource", want: MaterializedViewResource},
5556
{input: "snowflake_materialized_views_datasource", want: MaterializedViewsDatasource},

pkg/schemas/listing_details.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
66
)
77

8+
// TODO: Validate
9+
810
// DescribeListingSchema represents output of DESCRIBE LISTING for a single Listing.
911
var DescribeListingSchema = map[string]*schema.Schema{
1012
"global_name": {Type: schema.TypeString, Computed: true},
@@ -68,8 +70,6 @@ var DescribeListingSchema = map[string]*schema.Schema{
6870
"legacy_uniform_listing_locators": {Type: schema.TypeString, Computed: true},
6971
}
7072

71-
var _ = DescribeListingSchema
72-
7373
func ListingDetailsToSchema(details *sdk.ListingDetails) map[string]any {
7474
m := make(map[string]any)
7575
m["global_name"] = details.GlobalName
@@ -225,5 +225,3 @@ func ListingDetailsToSchema(details *sdk.ListingDetails) map[string]any {
225225
}
226226
return m
227227
}
228-
229-
var _ = ListingDetailsToSchema

pkg/testacc/data_source_listings_acceptance_test.go

Lines changed: 153 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,47 @@ package testacc
55
import (
66
"testing"
77

8-
accconfig "github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/acceptance/bettertestspoc/config"
9-
8+
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/acceptance/bettertestspoc/assert"
9+
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/acceptance/bettertestspoc/assert/resourceshowoutputassert"
10+
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/acceptance/bettertestspoc/config"
1011
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/acceptance/bettertestspoc/config/datasourcemodel"
12+
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/acceptance/bettertestspoc/config/model"
13+
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/acceptance/bettertestspoc/config/providermodel"
1114
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/acceptance/helpers/random"
15+
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/provider/previewfeatures"
16+
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/provider/resources"
17+
"github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/sdk"
1218
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
1319
"github.com/hashicorp/terraform-plugin-testing/tfversion"
1420
)
1521

1622
func TestAcc_Listings_BasicUseCase_DifferentFiltering(t *testing.T) {
17-
// We use a random prefix that does not exist to make assertions deterministic.
18-
prefix := "tf_acc_no_such_listing_" + random.AlphaN(8)
23+
prefix := random.AlphaN(4)
24+
idOne := testClient().Ids.RandomAccountObjectIdentifierWithPrefix(prefix + "1")
25+
idTwo := testClient().Ids.RandomAccountObjectIdentifierWithPrefix(prefix + "2")
26+
idThree := testClient().Ids.RandomAccountObjectIdentifier()
27+
28+
manifest, _ := testClient().Listing.BasicManifestWithUnquotedValues(t)
29+
30+
// Listings without share/app package cannot be published
31+
listingModel1 := model.ListingWithInlineManifest("listing_1", idOne.Name(), manifest).WithPublish("false")
32+
listingModel2 := model.ListingWithInlineManifest("listing_2", idTwo.Name(), manifest).WithPublish("false")
33+
listingModel3 := model.ListingWithInlineManifest("listing_3", idThree.Name(), manifest).WithPublish("false")
34+
35+
listingsLike := datasourcemodel.Listings("like").
36+
WithLike(idOne.Name()).
37+
WithDependsOn(listingModel1.ResourceReference(), listingModel2.ResourceReference(), listingModel3.ResourceReference())
1938

20-
listingsLike := datasourcemodel.Listings("test").
21-
WithLike(prefix)
2239
listingsStartsWith := datasourcemodel.Listings("test").
23-
WithStartsWith(prefix)
40+
WithStartsWith(prefix).
41+
WithDependsOn(listingModel1.ResourceReference(), listingModel2.ResourceReference(), listingModel3.ResourceReference())
42+
2443
listingsLimit := datasourcemodel.Listings("test").
25-
WithRowsAndFrom(1, "").
26-
WithStartsWith(prefix)
44+
WithRowsAndFrom(1, prefix).
45+
WithDependsOn(listingModel1.ResourceReference(), listingModel2.ResourceReference(), listingModel3.ResourceReference())
46+
47+
providerModel := providermodel.SnowflakeProvider().
48+
WithPreviewFeaturesEnabled(string(previewfeatures.ListingsDatasource))
2749

2850
resource.Test(t, resource.TestCase{
2951
ProtoV6ProviderFactories: TestAccProtoV6ProviderFactories,
@@ -32,27 +54,142 @@ func TestAcc_Listings_BasicUseCase_DifferentFiltering(t *testing.T) {
3254
},
3355
Steps: []resource.TestStep{
3456
{
35-
Config: accconfig.FromModels(t, listingsLike),
57+
Config: config.FromModels(t, providerModel, listingModel1, listingModel2, listingModel3, listingsLike),
3658
Check: resource.ComposeTestCheckFunc(
37-
resource.TestCheckResourceAttr(listingsLike.DatasourceReference(), "listings.#", "0"),
59+
resource.TestCheckResourceAttr(listingsLike.DatasourceReference(), "listings.#", "1"),
60+
resource.TestCheckResourceAttr(listingsLike.DatasourceReference(), "listings.0.show_output.#", "1"),
61+
resource.TestCheckResourceAttr(listingsLike.DatasourceReference(), "listings.0.show_output.0.name", idOne.Name()),
3862
),
3963
},
4064
{
41-
Config: accconfig.FromModels(t, listingsStartsWith),
65+
Config: config.FromModels(t, providerModel, listingModel1, listingModel2, listingModel3, listingsStartsWith),
4266
Check: resource.ComposeTestCheckFunc(
43-
resource.TestCheckResourceAttr(listingsStartsWith.DatasourceReference(), "listings.#", "0"),
67+
resource.TestCheckResourceAttr(listingsStartsWith.DatasourceReference(), "listings.#", "2"),
4468
),
4569
},
4670
{
47-
Config: accconfig.FromModels(t, listingsLimit),
71+
Config: config.FromModels(t, providerModel, listingModel1, listingModel2, listingModel3, listingsLimit),
4872
Check: resource.ComposeTestCheckFunc(
49-
resource.TestCheckResourceAttr(listingsLimit.DatasourceReference(), "listings.#", "0"),
73+
resource.TestCheckResourceAttr(listingsLimit.DatasourceReference(), "listings.#", "1"),
5074
),
5175
},
5276
},
5377
})
5478
}
5579

5680
func TestAcc_Listings_CompleteUseCase(t *testing.T) {
57-
t.Skip("Skipping: requires existing Marketplace listings to assert fields; enable when environment has listings.")
81+
id := testClient().Ids.RandomAccountObjectIdentifier()
82+
comment := random.Comment()
83+
84+
manifest, title := testClient().Listing.BasicManifestWithUnquotedValuesAndTargetAccounts(t)
85+
86+
share, shareCleanup := testClient().Share.CreateShare(t)
87+
t.Cleanup(shareCleanup)
88+
t.Cleanup(testClient().Grant.GrantPrivilegeOnDatabaseToShare(t, testClient().Ids.DatabaseId(), share.ID(), []sdk.ObjectPrivilege{sdk.ObjectPrivilegeUsage}))
89+
90+
listingModel := model.ListingWithInlineManifest("listing_complete", id.Name(), manifest).
91+
WithShare(share.ID().Name()).
92+
WithPublish("true").
93+
WithComment(comment)
94+
95+
listingsModelWithoutAdditional := datasourcemodel.Listings("without_additional").
96+
WithLike(id.Name()).
97+
WithStartsWith(id.Name()).
98+
WithLimit(1).
99+
WithWithDescribe(false).
100+
WithDependsOn(listingModel.ResourceReference())
101+
102+
listingsModel := datasourcemodel.Listings("with_additional").
103+
WithLike(id.Name()).
104+
WithStartsWith(id.Name()).
105+
WithLimit(1).
106+
WithDependsOn(listingModel.ResourceReference())
107+
108+
providerModel := providermodel.SnowflakeProvider().
109+
WithPreviewFeaturesEnabled(string(previewfeatures.ListingsDatasource))
110+
111+
resource.Test(t, resource.TestCase{
112+
ProtoV6ProviderFactories: TestAccProtoV6ProviderFactories,
113+
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
114+
tfversion.RequireAbove(tfversion.Version1_5_0),
115+
},
116+
CheckDestroy: CheckDestroy(t, resources.Listing),
117+
Steps: []resource.TestStep{
118+
{
119+
Config: config.FromModels(t, providerModel, listingModel, listingsModelWithoutAdditional),
120+
Check: assertThat(t,
121+
resourceshowoutputassert.ListingsDatasourceShowOutput(t, listingsModelWithoutAdditional.DatasourceReference()).
122+
HasName(id.Name()).
123+
HasTitle(title).
124+
HasState(sdk.ListingStatePublished).
125+
HasComment(comment),
126+
127+
assert.Check(resource.TestCheckResourceAttr(listingsModelWithoutAdditional.DatasourceReference(), "listings.0.describe_output.#", "0")),
128+
),
129+
},
130+
{
131+
Config: config.FromModels(t, providerModel, listingModel, listingsModel),
132+
Check: assertThat(t,
133+
resourceshowoutputassert.ListingsDatasourceShowOutput(t, listingsModel.DatasourceReference()).
134+
HasName(id.Name()).
135+
HasTitle(title).
136+
HasState(sdk.ListingStatePublished).
137+
HasComment(comment),
138+
139+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.#", "1")),
140+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.name", id.Name())),
141+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.title", title)),
142+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.description", "description")),
143+
assert.Check(resource.TestCheckResourceAttrSet(listingsModel.DatasourceReference(), "listings.0.describe_output.0.created_on")),
144+
assert.Check(resource.TestCheckResourceAttrSet(listingsModel.DatasourceReference(), "listings.0.describe_output.0.updated_on")),
145+
assert.Check(resource.TestCheckResourceAttrSet(listingsModel.DatasourceReference(), "listings.0.describe_output.0.owner")),
146+
assert.Check(resource.TestCheckResourceAttrSet(listingsModel.DatasourceReference(), "listings.0.describe_output.0.owner_role_type")),
147+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.state", "PUBLISHED")),
148+
assert.Check(resource.TestCheckResourceAttrSet(listingsModel.DatasourceReference(), "listings.0.describe_output.0.share")),
149+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.application_package", "")),
150+
assert.Check(resource.TestCheckResourceAttrSet(listingsModel.DatasourceReference(), "listings.0.describe_output.0.manifest_yaml")),
151+
assert.Check(resource.TestCheckResourceAttrSet(listingsModel.DatasourceReference(), "listings.0.describe_output.0.listing_terms")),
152+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.business_needs", "")),
153+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.usage_examples", "")),
154+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.data_attributes", "")),
155+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.categories", "")),
156+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.resources", "")),
157+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.profile", "")),
158+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.customized_contact_info", "")),
159+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.data_dictionary", "")),
160+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.data_preview", "")),
161+
assert.Check(resource.TestCheckResourceAttrSet(listingsModel.DatasourceReference(), "listings.0.describe_output.0.published_on")),
162+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.comment", comment)),
163+
assert.Check(resource.TestCheckResourceAttrSet(listingsModel.DatasourceReference(), "listings.0.describe_output.0.revisions")),
164+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.target_accounts", "")),
165+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.regions", "")),
166+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.refresh_schedule", "")),
167+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.refresh_type", "")),
168+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.review_state", "")),
169+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.rejection_reason", "")),
170+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.unpublished_by_admin_reasons", "")),
171+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.is_monetized", "false")),
172+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.is_application", "false")),
173+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.is_targeted", "true")),
174+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.is_limited_trial", "false")),
175+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.is_by_request", "false")),
176+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.limited_trial_plan", "")),
177+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.retried_on", "")),
178+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.scheduled_drop_time", "")),
179+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.distribution", "EXTERNAL")),
180+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.is_mountless_queryable", "false")),
181+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.organization_profile_name", "")),
182+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.uniform_listing_locator", "")),
183+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.approver_contact", "")),
184+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.support_contact", "")),
185+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.published_version_name", "")),
186+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.published_version_alias", "")),
187+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.is_share", "true")),
188+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.request_approval_type", "")),
189+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.monetization_display_order", "")),
190+
assert.Check(resource.TestCheckResourceAttr(listingsModel.DatasourceReference(), "listings.0.describe_output.0.legacy_uniform_listing_locators", "")),
191+
),
192+
},
193+
},
194+
})
58195
}

0 commit comments

Comments
 (0)