Skip to content

Commit d5516db

Browse files
committed
Ingest discouraged details in web features job
This change modifies the web features workflow to call the spanner logic that inserts discouraged details (if those details exist for a feature) Builds on #1211
1 parent 9f18ef4 commit d5516db

File tree

3 files changed

+100
-2
lines changed

3 files changed

+100
-2
lines changed

jsonschema/web-platform-dx_web-features/defs.schema.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@
7474
},
7575
"alternatives": {
7676
"description": "IDs for features that substitute some or all of this feature's utility",
77-
"items": {},
77+
"items": {
78+
"type": "string"
79+
},
7880
"type": "array"
7981
}
8082
},

lib/gcpspanner/spanneradapters/web_features_consumer.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ type WebFeatureSpannerClient interface {
3232
featureID string,
3333
featureAvailability gcpspanner.BrowserFeatureAvailability) error
3434
UpsertFeatureSpec(ctx context.Context, webFeatureID string, input gcpspanner.FeatureSpec) error
35+
UpsertFeatureDiscouragedDetails(ctx context.Context, featureID string,
36+
in gcpspanner.FeatureDiscouragedDetails) error
3537
PrecalculateBrowserFeatureSupportEvents(ctx context.Context, startAt, endAt time.Time) error
3638
}
3739

@@ -97,6 +99,21 @@ func (c *WebFeaturesConsumer) InsertWebFeatures(
9799
return nil, err
98100
}
99101

102+
if featureData.Discouraged != nil {
103+
err = c.client.UpsertFeatureDiscouragedDetails(ctx, featureID, gcpspanner.FeatureDiscouragedDetails{
104+
AccordingTo: featureData.Discouraged.AccordingTo,
105+
Alternatives: featureData.Discouraged.Alternatives,
106+
})
107+
if err != nil {
108+
slog.ErrorContext(ctx, "unable to insert Discouraged Details",
109+
"discoruagedDetails", featureData.Discouraged,
110+
"featureID", featureID,
111+
)
112+
113+
return nil, err
114+
}
115+
}
116+
100117
ret[featureID] = *id
101118
}
102119

lib/gcpspanner/spanneradapters/web_features_consumer_test.go

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,12 @@ type mockPrecalculateBrowserFeatureSupportEventsConfig struct {
223223
err error
224224
}
225225

226+
type mockUpsertFeatureDiscouragedDetailsConfig struct {
227+
expectedInputs map[string]gcpspanner.FeatureDiscouragedDetails
228+
outputs map[string]error
229+
expectedCount int
230+
}
231+
226232
type mockWebFeatureSpannerClient struct {
227233
t *testing.T
228234
upsertWebFeatureCount int
@@ -235,6 +241,8 @@ type mockWebFeatureSpannerClient struct {
235241
upsertFeatureSpecCount int
236242
mockPrecalculateBrowserFeatureSupportEventsCfg mockPrecalculateBrowserFeatureSupportEventsConfig
237243
precalculateBrowserFeatureSupportEventsCount int
244+
mockUpsertFeatureDiscouragedDetailsCfg mockUpsertFeatureDiscouragedDetailsConfig
245+
upsertFeatureDiscouragedDetailsCount int
238246
}
239247

240248
func (c *mockWebFeatureSpannerClient) UpsertWebFeature(
@@ -339,13 +347,34 @@ func (c *mockWebFeatureSpannerClient) PrecalculateBrowserFeatureSupportEvents(_
339347
return c.mockPrecalculateBrowserFeatureSupportEventsCfg.err
340348
}
341349

350+
func (c *mockWebFeatureSpannerClient) UpsertFeatureDiscouragedDetails(
351+
_ context.Context, featureID string, in gcpspanner.FeatureDiscouragedDetails) error {
352+
if len(c.mockUpsertFeatureDiscouragedDetailsCfg.expectedInputs) <= c.upsertFeatureDiscouragedDetailsCount {
353+
c.t.Fatal("no more expected input for UpsertFeatureDiscouragedDetails")
354+
}
355+
if len(c.mockUpsertFeatureDiscouragedDetailsCfg.outputs) <= c.upsertFeatureDiscouragedDetailsCount {
356+
c.t.Fatal("no more configured outputs for UpsertFeatureDiscouragedDetails")
357+
}
358+
expectedInput, found := c.mockUpsertFeatureDiscouragedDetailsCfg.expectedInputs[featureID]
359+
if !found {
360+
c.t.Errorf("unexpected input %v", in)
361+
}
362+
if !reflect.DeepEqual(expectedInput, in) {
363+
c.t.Errorf("unexpected input expected %v received %v", expectedInput, in)
364+
}
365+
c.upsertFeatureDiscouragedDetailsCount++
366+
367+
return c.mockUpsertFeatureDiscouragedDetailsCfg.outputs[featureID]
368+
}
369+
342370
func newMockmockWebFeatureSpannerClient(
343371
t *testing.T,
344372
mockUpsertWebFeatureCfg mockUpsertWebFeatureConfig,
345373
mockUpsertFeatureBaselineStatusCfg mockUpsertFeatureBaselineStatusConfig,
346374
mockInsertBrowserFeatureAvailabilityCfg mockInsertBrowserFeatureAvailabilityConfig,
347375
mockUpsertFeatureSpecCfg mockUpsertFeatureSpecConfig,
348376
mocmockPrecalculateBrowserFeatureSupportEventsCfg mockPrecalculateBrowserFeatureSupportEventsConfig,
377+
mockUpsertFeatureDiscouragedDetailsCfg mockUpsertFeatureDiscouragedDetailsConfig,
349378
) *mockWebFeatureSpannerClient {
350379
return &mockWebFeatureSpannerClient{
351380
t: t,
@@ -359,6 +388,8 @@ func newMockmockWebFeatureSpannerClient(
359388
insertBrowserFeatureAvailabilityCountPerFeature: map[string]int{},
360389
mockPrecalculateBrowserFeatureSupportEventsCfg: mocmockPrecalculateBrowserFeatureSupportEventsCfg,
361390
precalculateBrowserFeatureSupportEventsCount: 0,
391+
mockUpsertFeatureDiscouragedDetailsCfg: mockUpsertFeatureDiscouragedDetailsCfg,
392+
upsertFeatureDiscouragedDetailsCount: 0,
362393
}
363394
}
364395

@@ -367,6 +398,7 @@ var ErrBaselineStatusTest = errors.New("baseline status test error")
367398
var ErrBrowserFeatureAvailabilityTest = errors.New("browser feature availability test error")
368399
var ErrFeatureSpecTest = errors.New("feature spec test error")
369400
var ErrPrecalculateBrowserFeatureSupportEventsTest = errors.New("precalculate support events error")
401+
var ErrFeatureDiscouragedDetailsTest = errors.New("feature discouraged details test error")
370402

371403
// nolint:gochecknoglobals
372404
var (
@@ -383,6 +415,7 @@ func TestInsertWebFeatures(t *testing.T) {
383415
mockInsertBrowserFeatureAvailabilityCfg mockInsertBrowserFeatureAvailabilityConfig
384416
mockUpsertFeatureSpecCfg mockUpsertFeatureSpecConfig
385417
mockPrecalculateBrowserFeatureSupportEventsCfg mockPrecalculateBrowserFeatureSupportEventsConfig
418+
mockUpsertFeatureDiscouragedDetailsCfg mockUpsertFeatureDiscouragedDetailsConfig
386419
input map[string]web_platform_dx__web_features.FeatureValue
387420
expectedError error // Expected error from InsertWebFeatures
388421
}{
@@ -493,7 +526,10 @@ func TestInsertWebFeatures(t *testing.T) {
493526
Name: "Feature 1",
494527
Caniuse: nil,
495528
CompatFeatures: nil,
496-
Discouraged: nil,
529+
Discouraged: &web_platform_dx__web_features.Discouraged{
530+
AccordingTo: []string{"according-to-1", "according-to-2"},
531+
Alternatives: []string{"alternative-1", "alternative-2"},
532+
},
497533
Spec: &web_platform_dx__web_features.StringOrStringArray{
498534
StringArray: []string{"feature1-link1", "feature1-link2"},
499535
String: nil,
@@ -558,6 +594,16 @@ func TestInsertWebFeatures(t *testing.T) {
558594
expectedCount: 1,
559595
err: nil,
560596
},
597+
mockUpsertFeatureDiscouragedDetailsCfg: mockUpsertFeatureDiscouragedDetailsConfig{
598+
expectedInputs: map[string]gcpspanner.FeatureDiscouragedDetails{
599+
"feature1": {
600+
AccordingTo: []string{"according-to-1", "according-to-2"},
601+
Alternatives: []string{"alternative-1", "alternative-2"},
602+
},
603+
},
604+
outputs: map[string]error{"feature1": nil},
605+
expectedCount: 1,
606+
},
561607
expectedError: nil,
562608
},
563609
{
@@ -596,6 +642,11 @@ func TestInsertWebFeatures(t *testing.T) {
596642
expectedCount: 0,
597643
err: nil,
598644
},
645+
mockUpsertFeatureDiscouragedDetailsCfg: mockUpsertFeatureDiscouragedDetailsConfig{
646+
expectedInputs: map[string]gcpspanner.FeatureDiscouragedDetails{},
647+
outputs: map[string]error{},
648+
expectedCount: 0,
649+
},
599650
input: map[string]web_platform_dx__web_features.FeatureValue{
600651
"feature1": {
601652
Name: "Feature 1",
@@ -704,6 +755,11 @@ func TestInsertWebFeatures(t *testing.T) {
704755
expectedCount: 0,
705756
err: nil,
706757
},
758+
mockUpsertFeatureDiscouragedDetailsCfg: mockUpsertFeatureDiscouragedDetailsConfig{
759+
expectedInputs: map[string]gcpspanner.FeatureDiscouragedDetails{},
760+
outputs: map[string]error{},
761+
expectedCount: 0,
762+
},
707763
expectedError: ErrBaselineStatusTest,
708764
},
709765
{
@@ -792,6 +848,11 @@ func TestInsertWebFeatures(t *testing.T) {
792848
expectedCount: 0,
793849
err: nil,
794850
},
851+
mockUpsertFeatureDiscouragedDetailsCfg: mockUpsertFeatureDiscouragedDetailsConfig{
852+
expectedInputs: map[string]gcpspanner.FeatureDiscouragedDetails{},
853+
outputs: map[string]error{},
854+
expectedCount: 0,
855+
},
795856
expectedError: ErrBrowserFeatureAvailabilityTest,
796857
},
797858
{
@@ -904,6 +965,11 @@ func TestInsertWebFeatures(t *testing.T) {
904965
expectedCount: 0,
905966
err: nil,
906967
},
968+
mockUpsertFeatureDiscouragedDetailsCfg: mockUpsertFeatureDiscouragedDetailsConfig{
969+
expectedInputs: map[string]gcpspanner.FeatureDiscouragedDetails{},
970+
outputs: map[string]error{},
971+
expectedCount: 0,
972+
},
907973
expectedError: ErrFeatureSpecTest,
908974
},
909975
{
@@ -1078,6 +1144,11 @@ func TestInsertWebFeatures(t *testing.T) {
10781144
expectedCount: 1,
10791145
err: ErrPrecalculateBrowserFeatureSupportEventsTest,
10801146
},
1147+
mockUpsertFeatureDiscouragedDetailsCfg: mockUpsertFeatureDiscouragedDetailsConfig{
1148+
expectedInputs: map[string]gcpspanner.FeatureDiscouragedDetails{},
1149+
outputs: map[string]error{},
1150+
expectedCount: 0,
1151+
},
10811152
expectedError: ErrPrecalculateBrowserFeatureSupportEventsTest,
10821153
},
10831154
}
@@ -1091,6 +1162,7 @@ func TestInsertWebFeatures(t *testing.T) {
10911162
tc.mockInsertBrowserFeatureAvailabilityCfg,
10921163
tc.mockUpsertFeatureSpecCfg,
10931164
tc.mockPrecalculateBrowserFeatureSupportEventsCfg,
1165+
tc.mockUpsertFeatureDiscouragedDetailsCfg,
10941166
)
10951167
consumer := NewWebFeaturesConsumer(mockClient)
10961168

@@ -1134,6 +1206,13 @@ func TestInsertWebFeatures(t *testing.T) {
11341206
mockClient.mockPrecalculateBrowserFeatureSupportEventsCfg.expectedCount,
11351207
mockClient.precalculateBrowserFeatureSupportEventsCount)
11361208
}
1209+
1210+
if mockClient.upsertFeatureDiscouragedDetailsCount !=
1211+
mockClient.mockUpsertFeatureDiscouragedDetailsCfg.expectedCount {
1212+
t.Errorf("expected %d calls to UpsertFeatureDiscouragedDetails, got %d",
1213+
mockClient.mockUpsertFeatureDiscouragedDetailsCfg.expectedCount,
1214+
mockClient.upsertFeatureDiscouragedDetailsCount)
1215+
}
11371216
})
11381217
}
11391218
}

0 commit comments

Comments
 (0)