diff --git a/.gitignore b/.gitignore index d186421c6..a7657ca28 100644 --- a/.gitignore +++ b/.gitignore @@ -44,6 +44,7 @@ frontend/.postinstall lib/gen/*/*/*.go lib/gen/*/*/*.ts lib/gen/featuresearch/** +jsonschema/web-platform-dx_web-features/defs_final.schema.json # Ignore coverage files coverage diff --git a/Makefile b/Makefile index 4d3ea1265..b28eaa0d0 100644 --- a/Makefile +++ b/Makefile @@ -181,16 +181,20 @@ download-schemas: wget -O jsonschema/mdn_browser-compat-data/browsers.schema.json \ https://raw.githubusercontent.com/mdn/browser-compat-data/main/schemas/browsers.schema.json +# Use the workaround in https://github.com/glideapps/quicktype/issues/518 to generate ALL types +# Currently, StringOrStrings and UrlOrURLs cannot be in the same jsonschema because quicktype +# sees that they are the same and tries to optimize. Remove one and keep the other. jsonschema: + rm -f $(JSONSCHEMA_OUT_DIR)/web_platform_dx__web_features/*.go + cat jsonschema/web-platform-dx_web-features/defs.schema.json | jq 'walk(if type == "string" and . == "#/definitions/URLOrURLs" then "#/definitions/StringOrStrings" else . end) | del(.definitions.URLOrURLs)' > jsonschema/web-platform-dx_web-features/defs_final.schema.json npx quicktype \ - --src jsonschema/web-platform-dx_web-features/defs.schema.json \ + --src jsonschema/web-platform-dx_web-features/defs_final.schema.json#/definitions/ \ --src-lang schema \ --lang go \ - --top-level FeatureData \ - --out $(JSONSCHEMA_OUT_DIR)/web_platform_dx__web_features/feature_data.go \ + --top-level WebFeaturesData \ + --out $(JSONSCHEMA_OUT_DIR)/web_platform_dx__web_features/types.go \ --package web_platform_dx__web_features \ --field-tags json - npx quicktype \ --src jsonschema/mdn_browser-compat-data/browsers.schema.json \ --src-lang schema \ diff --git a/jsonschema/web-platform-dx_web-features/defs.schema.json b/jsonschema/web-platform-dx_web-features/defs.schema.json index e31d3d69e..5e8c6f024 100644 --- a/jsonschema/web-platform-dx_web-features/defs.schema.json +++ b/jsonschema/web-platform-dx_web-features/defs.schema.json @@ -1,57 +1,124 @@ { - "$ref": "#/definitions/WebFeaturesData", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "StringOrStringArray": { - "additionalProperties": false, - "anyOf": [ - { - "type": "string" + "$schema": "http://json-schema.org/draft-07/schema", + "description": "The top-level web-features data package", + "type": "object", + "properties": { + "browsers": { + "description": "Browsers and browser release data", + "type": "object", + "properties": { + "chrome": { + "$ref": "#/definitions/BrowserData" }, - { - "items": { - "type": "string" + "chrome_android": { + "$ref": "#/definitions/BrowserData" + }, + "edge": { + "$ref": "#/definitions/BrowserData" + }, + "firefox": { + "$ref": "#/definitions/BrowserData" + }, + "firefox_android": { + "$ref": "#/definitions/BrowserData" + }, + "safari": { + "$ref": "#/definitions/BrowserData" + }, + "safari_ios": { + "$ref": "#/definitions/BrowserData" + } + }, + "required": [ + "chrome", + "chrome_android", + "edge", + "firefox", + "firefox_android", + "safari", + "safari_ios" + ], + "additionalProperties": false + }, + "features": { + "description": "Feature identifiers and data", + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "$ref": "#/definitions/FeatureData" + }, + { + "$ref": "#/definitions/FeatureMovedData" }, - "minItems": 2, - "type": "array" + { + "$ref": "#/definitions/FeatureSplitData" + } + ], + "$comment": "Use the `kind` property as a discriminator." + } + }, + "groups": { + "description": "Group identifiers and data", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/GroupData" + } + }, + "snapshots": { + "description": "Snapshot identifiers and data", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/SnapshotData" + } + } + }, + "required": ["browsers", "features", "groups"], + "additionalProperties": false, + "definitions": { + "Discouraged": { + "type": "object", + "properties": { + "according_to": { + "description": "Links to a formal discouragement notice, such as specification text, intent-to-unship, etc.", + "$ref": "#/definitions/URLs" + }, + "alternatives": { + "description": "IDs for features that substitute some or all of this feature's utility", + "$ref": "#/definitions/Strings" } - ] + }, + "required": ["according_to"], + "additionalProperties": false }, "BrowserData": { - "additionalProperties": false, "description": "Browser information", + "type": "object", "properties": { "name": { "description": "The name of the browser, as in \"Edge\" or \"Safari on iOS\"", "type": "string" }, "releases": { - "description": "The browser's releases", + "type": "array", "items": { "$ref": "#/definitions/Release" - }, - "type": "array" + } } }, - "required": [ - "name", - "releases" - ], - "type": "object" + "required": ["name", "releases"], + "additionalProperties": false }, "FeatureData": { - "additionalProperties": false, + "description": "A feature data entry", + "type": "object", "properties": { - "caniuse": { - "$ref": "#/definitions/StringOrStringArray", - "description": "caniuse.com identifier(s)" + "kind": { + "const": "feature" }, - "compat_features": { - "description": "Sources of support data for this feature", - "items": { - "type": "string" - }, - "type": "array" + "name": { + "description": "Short name", + "type": "string" }, "description": { "description": "Short description of the feature, as a plain text string", @@ -61,179 +128,47 @@ "description": "Short description of the feature, as an HTML string", "type": "string" }, - "discouraged": { - "additionalProperties": false, - "description": "Whether developers are formally discouraged from using this feature", - "properties": { - "according_to": { - "description": "Links to a formal discouragement notice, such as specification text, intent-to-unship, etc.", - "items": { - "type": "string" - }, - "type": "array" - }, - "alternatives": { - "description": "IDs for features that substitute some or all of this feature's utility", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "according_to" - ], - "type": "object" + "spec": { + "description": "Specification URL(s)", + "$ref": "#/definitions/URLOrURLs" }, "group": { - "$ref": "#/definitions/StringOrStringArray", - "description": "Group identifier(s)" - }, - "name": { - "description": "Short name", - "type": "string" + "description": "Group identifier(s)", + "$ref": "#/definitions/StringOrStrings" }, "snapshot": { - "$ref": "#/definitions/StringOrStringArray", - "description": "Snapshot identifier(s)" + "description": "Snapshot identifier(s)", + "$ref": "#/definitions/StringOrStrings" }, - "spec": { - "$ref": "#/definitions/StringOrStringArray", - "description": "Specification URL(s)" + "caniuse": { + "description": "caniuse.com identifier(s)", + "$ref": "#/definitions/StringOrStrings" + }, + "compat_features": { + "description": "Sources of support data for this feature", + "$ref": "#/definitions/Strings" }, "status": { - "additionalProperties": false, - "description": "Whether a feature is considered a \"baseline\" web platform feature and when it achieved that status", - "properties": { - "baseline": { - "description": "Whether the feature is Baseline (low substatus), Baseline (high substatus), or not (false)", - "enum": [ - "high", - "low", - false - ], - "type": [ - "string", - "boolean" - ] - }, - "baseline_high_date": { - "description": "Date the feature achieved Baseline high status", - "type": "string" - }, - "baseline_low_date": { - "description": "Date the feature achieved Baseline low status", - "type": "string" - }, - "by_compat_key": { - "additionalProperties": { - "additionalProperties": false, - "properties": { - "baseline": { - "description": "Whether the feature is Baseline (low substatus), Baseline (high substatus), or not (false)", - "enum": [ - "high", - "low", - false - ], - "type": [ - "string", - "boolean" - ] - }, - "baseline_high_date": { - "description": "Date the feature achieved Baseline high status", - "type": "string" - }, - "baseline_low_date": { - "description": "Date the feature achieved Baseline low status", - "type": "string" - }, - "support": { - "additionalProperties": false, - "description": "Browser versions that most-recently introduced the feature", - "properties": { - "chrome": { - "type": "string" - }, - "chrome_android": { - "type": "string" - }, - "edge": { - "type": "string" - }, - "firefox": { - "type": "string" - }, - "firefox_android": { - "type": "string" - }, - "safari": { - "type": "string" - }, - "safari_ios": { - "type": "string" - } - }, - "type": "object" - } - }, - "required": [ - "baseline", - "support" - ], - "type": "object" - }, - "description": "Statuses for each key in the feature's compat_features list, if applicable. Not available to the npm release of web-features.", - "type": "object" - }, - "support": { - "additionalProperties": false, - "description": "Browser versions that most-recently introduced the feature", - "properties": { - "chrome": { - "type": "string" - }, - "chrome_android": { - "type": "string" - }, - "edge": { - "type": "string" - }, - "firefox": { - "type": "string" - }, - "firefox_android": { - "type": "string" - }, - "safari": { - "type": "string" - }, - "safari_ios": { - "type": "string" - } - }, - "type": "object" - } - }, - "required": [ - "baseline", - "support" - ], - "type": "object" + "description": "Whether a feature is considered a \"Baseline\" web platform feature and when it achieved that status", + "$ref": "#/definitions/StatusHeadline" + }, + "discouraged": { + "description": "Whether developers are formally discouraged from using this feature", + "$ref": "#/definitions/Discouraged" } }, "required": [ + "kind", "name", "description", "description_html", "spec", "status" ], - "type": "object" + "additionalProperties": false }, "GroupData": { - "additionalProperties": false, + "type": "object", "properties": { "name": { "description": "Short name", @@ -244,117 +179,179 @@ "type": "string" } }, - "required": [ - "name" - ], - "type": "object" + "required": ["name"], + "additionalProperties": false }, "Release": { - "additionalProperties": false, "description": "Browser release information", + "type": "object", "properties": { - "date": { - "description": "The release date, as in \"2023-12-11\"", - "type": "string" - }, "version": { "description": "The version string, as in \"10\" or \"17.1\"", "type": "string" + }, + "date": { + "description": " The release date, as in \"2023-12-11\"", + "type": "string" } }, - "required": [ - "version", - "date" - ], - "type": "object" + "required": ["version", "date"], + "additionalProperties": false }, - "SnapshotData": { - "additionalProperties": false, + "FeatureMovedData": { + "description": "A feature has permanently moved to exactly one other ID", + "type": "object", "properties": { - "name": { - "description": "Short name", - "type": "string" + "kind": { + "const": "moved" }, - "spec": { - "description": "Specification", + "redirect_target": { + "description": "The new ID for this feature", "type": "string" } }, - "required": [ - "name", - "spec" - ], - "type": "object" + "required": ["kind", "redirect_target"], + "additionalProperties": false }, - "WebFeaturesData": { - "additionalProperties": false, + "FeatureSplitData": { + "description": "A feature has split into two or more other features", + "type": "object", "properties": { - "browsers": { - "additionalProperties": false, - "description": "Browsers and browser release data", + "kind": { + "const": "split" + }, + "redirect_targets": { + "description": "The new IDs for this feature", + "$ref": "#/definitions/Strings" + } + }, + "required": ["kind", "redirect_targets"], + "additionalProperties": false + }, + "Status": { + "type": "object", + "properties": { + "baseline": { + "description": "Whether the feature is Baseline (low substatus), Baseline (high substatus), or not (false)", + "enum": ["high", "low", false] + }, + "baseline_high_date": { + "description": "Date the feature achieved Baseline high status", + "type": "string" + }, + "baseline_low_date": { + "description": "Date the feature achieved Baseline low status", + "type": "string" + }, + "support": { + "description": "Browser versions that most-recently introduced the feature", + "type": "object", "properties": { "chrome": { - "$ref": "#/definitions/BrowserData" + "type": "string" }, "chrome_android": { - "$ref": "#/definitions/BrowserData" + "type": "string" }, "edge": { - "$ref": "#/definitions/BrowserData" + "type": "string" }, "firefox": { - "$ref": "#/definitions/BrowserData" + "type": "string" }, "firefox_android": { - "$ref": "#/definitions/BrowserData" + "type": "string" }, "safari": { - "$ref": "#/definitions/BrowserData" + "type": "string" }, "safari_ios": { - "$ref": "#/definitions/BrowserData" + "type": "string" } }, - "required": [ - "chrome", - "chrome_android", - "edge", - "firefox", - "firefox_android", - "safari", - "safari_ios" - ], - "type": "object" - }, - "features": { + "additionalProperties": false + } + }, + "required": ["baseline", "support"] + }, + "StatusHeadline": { + "type": "object", + "allOf": [{ "$ref": "#/definitions/Status" }], + "properties": { + "baseline": {}, + "baseline_high_date": {}, + "baseline_low_date": {}, + "support": {}, + "by_compat_key": { + "description": "Statuses for each key in the feature's compat_features list, if applicable. Not available to the npm release of web-features.", + "type": "object", "additionalProperties": { - "$ref": "#/definitions/FeatureData" - }, - "description": "Feature identifiers and data", - "type": "object" + "$ref": "#/definitions/Status" + } + } + }, + "required": ["baseline", "support"], + "additionalProperties": false + }, + "SnapshotData": { + "type": "object", + "properties": { + "name": { + "description": "Short name", + "type": "string" }, - "groups": { - "additionalProperties": { - "$ref": "#/definitions/GroupData" - }, - "description": "Group identifiers and data", - "type": "object" + "spec": { + "description": "Specification", + "$ref": "#/definitions/URL" + } + }, + "required": ["name", "spec"], + "additionalProperties": false + }, + "StringOrStrings": { + "oneOf": [ + { + "type": "string" }, - "snapshots": { - "additionalProperties": { - "$ref": "#/definitions/SnapshotData" + { + "type": "array", + "items": { + "type": "string" }, - "description": "Snapshot identifiers and data", - "type": "object" + "minItems": 2 } + ] + }, + "Strings": { + "type": "array", + "items": { + "type": "string" }, - "required": [ - "browsers", - "features", - "groups", - "snapshots" - ], - "type": "object" + "minItems": 1 + }, + "URL": { + "type": "string" + }, + "URLs": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "URLOrURLs": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 2 + } + ] } } } \ No newline at end of file diff --git a/lib/gcpspanner/spanneradapters/web_feature_groups_consumer.go b/lib/gcpspanner/spanneradapters/web_feature_groups_consumer.go index 53c454500..8e3be5074 100644 --- a/lib/gcpspanner/spanneradapters/web_feature_groups_consumer.go +++ b/lib/gcpspanner/spanneradapters/web_feature_groups_consumer.go @@ -20,6 +20,7 @@ import ( "github.com/GoogleChrome/webstatus.dev/lib/gcpspanner" "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/GoogleChrome/webstatus.dev/lib/webdxfeaturetypes" ) // WebFeatureGroupsClient expects a subset of the functionality from lib/gcpspanner that only apply to Groups. @@ -41,11 +42,11 @@ type WebFeatureGroupConsumer struct { } func extractFeatureKeyToGroupsMapping( - featuresData map[string]web_platform_dx__web_features.FeatureValue, + featuresData webdxfeaturetypes.FeatureKinds, ) map[string][]string { m := make(map[string][]string) - for featureKey, feature := range featuresData { + for featureKey, feature := range featuresData.Data { if feature.Group == nil { continue } @@ -64,7 +65,7 @@ func extractFeatureKeyToGroupsMapping( func (c *WebFeatureGroupConsumer) InsertWebFeatureGroups( ctx context.Context, - featureData map[string]web_platform_dx__web_features.FeatureValue, + featureData webdxfeaturetypes.FeatureKinds, groupData map[string]web_platform_dx__web_features.GroupData) error { groupKeyToInternalID := make(map[string]string, len(groupData)) childToParentMap := make(map[string]string) diff --git a/lib/gcpspanner/spanneradapters/web_feature_groups_consumer_test.go b/lib/gcpspanner/spanneradapters/web_feature_groups_consumer_test.go index 7fd3af8ce..5ae6169a7 100644 --- a/lib/gcpspanner/spanneradapters/web_feature_groups_consumer_test.go +++ b/lib/gcpspanner/spanneradapters/web_feature_groups_consumer_test.go @@ -23,6 +23,7 @@ import ( "github.com/GoogleChrome/webstatus.dev/lib/gcpspanner" "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/GoogleChrome/webstatus.dev/lib/webdxfeaturetypes" ) type mockUpsertGroupConfig struct { @@ -49,7 +50,7 @@ func TestInsertWebFeatureGroups(t *testing.T) { mockUpsertGroupCfg mockUpsertGroupConfig mockUpsertFeatureGroupLookupsCfg mockUpsertFeatureGroupLookupsConfig featureKeyToID map[string]string - featureData map[string]web_platform_dx__web_features.FeatureValue + featureData webdxfeaturetypes.FeatureKinds groupData map[string]web_platform_dx__web_features.GroupData expectedError error }{ @@ -90,62 +91,68 @@ func TestInsertWebFeatureGroups(t *testing.T) { "feature1": "featureID1", "feature2": "featureID2", }, - featureData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Group: &web_platform_dx__web_features.StringOrStringArray{ - StringArray: []string{"group1", "group2"}, - String: nil, - }, - Caniuse: nil, - CompatFeatures: nil, - Description: "", - DescriptionHTML: "", - Discouraged: nil, - Name: "", - Snapshot: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + featureData: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Group: &web_platform_dx__web_features.StringOrStrings{ + StringArray: []string{"group1", "group2"}, + String: nil, + }, + Kind: web_platform_dx__web_features.Feature, + Caniuse: nil, + CompatFeatures: nil, + Description: "", + DescriptionHTML: "", + Discouraged: nil, + Name: "", + Snapshot: nil, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, }, - }, - "feature2": { - Group: &web_platform_dx__web_features.StringOrStringArray{ - String: valuePtr("group2"), - StringArray: nil, - }, - Caniuse: nil, - CompatFeatures: nil, - Description: "", - DescriptionHTML: "", - Discouraged: nil, - Name: "", - Snapshot: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + "feature2": { + Group: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("group2"), + StringArray: nil, + }, + Kind: web_platform_dx__web_features.Feature, + Caniuse: nil, + CompatFeatures: nil, + Description: "", + DescriptionHTML: "", + Discouraged: nil, + Name: "", + Snapshot: nil, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, }, }, diff --git a/lib/gcpspanner/spanneradapters/web_feature_snapshots_consumer.go b/lib/gcpspanner/spanneradapters/web_feature_snapshots_consumer.go index 33314ef26..6d58c24f7 100644 --- a/lib/gcpspanner/spanneradapters/web_feature_snapshots_consumer.go +++ b/lib/gcpspanner/spanneradapters/web_feature_snapshots_consumer.go @@ -20,6 +20,7 @@ import ( "github.com/GoogleChrome/webstatus.dev/lib/gcpspanner" "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/GoogleChrome/webstatus.dev/lib/webdxfeaturetypes" ) // WebFeatureSnapshotsClient expects a subset of the functionality from lib/gcpspanner that only apply to Snapshots. @@ -64,11 +65,11 @@ func (c *WebFeatureSnapshotConsumer) upsertSnapshots( func (c *WebFeatureSnapshotConsumer) upsertSnapshotMappings( ctx context.Context, featureKeyToID map[string]string, - featureData map[string]web_platform_dx__web_features.FeatureValue, + featureData webdxfeaturetypes.FeatureKinds, snapshotKeyToInternalID map[string]string, ) error { for featureKey, featureID := range featureKeyToID { - feature := featureData[featureKey] + feature := featureData.Data[featureKey] if feature.Snapshot == nil { continue } @@ -110,7 +111,7 @@ func (c *WebFeatureSnapshotConsumer) upsertSnapshotMappings( func (c *WebFeatureSnapshotConsumer) InsertWebFeatureSnapshots( ctx context.Context, featureKeyToID map[string]string, - featureData map[string]web_platform_dx__web_features.FeatureValue, + featureData webdxfeaturetypes.FeatureKinds, snapshotData map[string]web_platform_dx__web_features.SnapshotData) error { snapshotKeyToInternalID := make(map[string]string, len(snapshotData)) // Upsert basic snapshot data and get snapshot ids. diff --git a/lib/gcpspanner/spanneradapters/web_feature_snapshots_consumer_test.go b/lib/gcpspanner/spanneradapters/web_feature_snapshots_consumer_test.go index 7715ad23e..7efd021e2 100644 --- a/lib/gcpspanner/spanneradapters/web_feature_snapshots_consumer_test.go +++ b/lib/gcpspanner/spanneradapters/web_feature_snapshots_consumer_test.go @@ -23,6 +23,7 @@ import ( "github.com/GoogleChrome/webstatus.dev/lib/gcpspanner" "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/GoogleChrome/webstatus.dev/lib/webdxfeaturetypes" ) type mockUpsertSnapshotConfig struct { @@ -110,7 +111,7 @@ func TestInsertWebFeatureSnapshots(t *testing.T) { mockUpsertSnapshotCfg mockUpsertSnapshotConfig mockUpsertWebFeatureSnapshotCfg mockUpsertWebFeatureSnapshotConfig featureKeyToID map[string]string - featureData map[string]web_platform_dx__web_features.FeatureValue + featureData webdxfeaturetypes.FeatureKinds snapshotData map[string]web_platform_dx__web_features.SnapshotData expectedError error }{ @@ -146,62 +147,68 @@ func TestInsertWebFeatureSnapshots(t *testing.T) { "feature1": "featureID1", "feature2": "featureID2", }, - featureData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Discouraged: nil, - Snapshot: &web_platform_dx__web_features.StringOrStringArray{ - StringArray: []string{"snapshot1", "snapshot2"}, - String: nil, - }, - Caniuse: nil, - CompatFeatures: nil, - Description: "", - DescriptionHTML: "", - Name: "", - Group: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - ByCompatKey: nil, - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + featureData: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Discouraged: nil, + Snapshot: &web_platform_dx__web_features.StringOrStrings{ + StringArray: []string{"snapshot1", "snapshot2"}, + String: nil, + }, + Kind: web_platform_dx__web_features.Feature, + Caniuse: nil, + CompatFeatures: nil, + Description: "", + DescriptionHTML: "", + Name: "", + Group: nil, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + ByCompatKey: nil, + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, }, - }, - "feature2": { - Discouraged: nil, - Snapshot: &web_platform_dx__web_features.StringOrStringArray{ - String: valuePtr("snapshot1"), - StringArray: nil, - }, - Caniuse: nil, - CompatFeatures: nil, - Description: "", - DescriptionHTML: "", - Name: "", - Group: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + "feature2": { + Discouraged: nil, + Snapshot: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("snapshot1"), + StringArray: nil, + }, + Kind: web_platform_dx__web_features.Feature, + Caniuse: nil, + CompatFeatures: nil, + Description: "", + DescriptionHTML: "", + Name: "", + Group: nil, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, }, }, diff --git a/lib/gcpspanner/spanneradapters/web_features_consumer.go b/lib/gcpspanner/spanneradapters/web_features_consumer.go index 634f30614..968dc9d02 100644 --- a/lib/gcpspanner/spanneradapters/web_features_consumer.go +++ b/lib/gcpspanner/spanneradapters/web_features_consumer.go @@ -21,6 +21,7 @@ import ( "github.com/GoogleChrome/webstatus.dev/lib/gcpspanner" "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/GoogleChrome/webstatus.dev/lib/webdxfeaturetypes" ) // WebFeatureSpannerClient expects a subset of the functionality from lib/gcpspanner that only apply to WebFeatures. @@ -51,11 +52,11 @@ type WebFeaturesConsumer struct { func (c *WebFeaturesConsumer) InsertWebFeatures( ctx context.Context, - data map[string]web_platform_dx__web_features.FeatureValue, + data webdxfeaturetypes.FeatureKinds, startAt, endAt time.Time) (map[string]string, error) { // 1. Prepare all WebFeature structs from the input data. - allFeatures := make([]gcpspanner.WebFeature, 0, len(data)) - for featureID, featureData := range data { + allFeatures := make([]gcpspanner.WebFeature, 0, len(data.Data)) + for featureID, featureData := range data.Data { webFeature := gcpspanner.WebFeature{ FeatureKey: featureID, Name: featureData.Name, @@ -74,7 +75,7 @@ func (c *WebFeaturesConsumer) InsertWebFeatures( } // 3. Loop through the data again to process all related entities for each feature. - for featureID, featureData := range data { + for featureID, featureData := range data.Data { featureBaselineStatus := gcpspanner.FeatureBaselineStatus{ Status: getBaselineStatusEnum(featureData.Status), LowDate: nil, @@ -151,7 +152,7 @@ func (c *WebFeaturesConsumer) InsertWebFeatures( func consumeFeatureSpecInformation(ctx context.Context, client WebFeatureSpannerClient, featureID string, - featureData web_platform_dx__web_features.FeatureValue) error { + featureData web_platform_dx__web_features.FeatureData) error { if featureData.Spec == nil { return nil } @@ -185,7 +186,7 @@ func consumeFeatureSpecInformation(ctx context.Context, } func extractBrowserAvailability( - featureData web_platform_dx__web_features.FeatureValue) []gcpspanner.BrowserFeatureAvailability { + featureData web_platform_dx__web_features.FeatureData) []gcpspanner.BrowserFeatureAvailability { var fba []gcpspanner.BrowserFeatureAvailability support := featureData.Status.Support if support.Chrome != nil { @@ -252,7 +253,7 @@ func convertStringToDate(in *string) *time.Time { } // getBaselineStatusEnum converts the web feature status to the Spanner-compatible BaselineStatus type. -func getBaselineStatusEnum(status web_platform_dx__web_features.Status) *gcpspanner.BaselineStatus { +func getBaselineStatusEnum(status web_platform_dx__web_features.StatusHeadline) *gcpspanner.BaselineStatus { if status.Baseline == nil { return nil } diff --git a/lib/gcpspanner/spanneradapters/web_features_consumer_test.go b/lib/gcpspanner/spanneradapters/web_features_consumer_test.go index bb8d27859..5bec580a8 100644 --- a/lib/gcpspanner/spanneradapters/web_features_consumer_test.go +++ b/lib/gcpspanner/spanneradapters/web_features_consumer_test.go @@ -24,6 +24,7 @@ import ( "github.com/GoogleChrome/webstatus.dev/lib/gcpspanner" "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/GoogleChrome/webstatus.dev/lib/webdxfeaturetypes" "github.com/google/go-cmp/cmp" ) @@ -55,13 +56,13 @@ func TestConvertStringToDate(t *testing.T) { func TestGetBaselineStatusEnum(t *testing.T) { testCases := []struct { name string - input web_platform_dx__web_features.Status + input web_platform_dx__web_features.StatusHeadline expected *gcpspanner.BaselineStatus }{ { name: "undefined status", - input: web_platform_dx__web_features.Status{ - Support: web_platform_dx__web_features.StatusSupport{ + input: web_platform_dx__web_features.StatusHeadline{ + Support: web_platform_dx__web_features.Support{ Chrome: nil, ChromeAndroid: nil, Edge: nil, @@ -79,11 +80,11 @@ func TestGetBaselineStatusEnum(t *testing.T) { }, { name: "undefined baseline", - input: web_platform_dx__web_features.Status{ + input: web_platform_dx__web_features.StatusHeadline{ BaselineHighDate: nil, BaselineLowDate: nil, ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ + Support: web_platform_dx__web_features.Support{ Chrome: nil, ChromeAndroid: nil, Edge: nil, @@ -98,11 +99,11 @@ func TestGetBaselineStatusEnum(t *testing.T) { }, { name: "enum: High", - input: web_platform_dx__web_features.Status{ + input: web_platform_dx__web_features.StatusHeadline{ BaselineHighDate: nil, BaselineLowDate: nil, ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ + Support: web_platform_dx__web_features.Support{ Chrome: nil, ChromeAndroid: nil, Edge: nil, @@ -120,11 +121,11 @@ func TestGetBaselineStatusEnum(t *testing.T) { }, { name: "enum: Low", - input: web_platform_dx__web_features.Status{ + input: web_platform_dx__web_features.StatusHeadline{ BaselineHighDate: nil, BaselineLowDate: nil, ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ + Support: web_platform_dx__web_features.Support{ Chrome: nil, ChromeAndroid: nil, Edge: nil, @@ -142,11 +143,11 @@ func TestGetBaselineStatusEnum(t *testing.T) { }, { name: "bool: False", - input: web_platform_dx__web_features.Status{ + input: web_platform_dx__web_features.StatusHeadline{ BaselineHighDate: nil, BaselineLowDate: nil, ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ + Support: web_platform_dx__web_features.Support{ Chrome: nil, ChromeAndroid: nil, Edge: nil, @@ -164,11 +165,11 @@ func TestGetBaselineStatusEnum(t *testing.T) { }, { name: "bool: True (should never happen)", - input: web_platform_dx__web_features.Status{ + input: web_platform_dx__web_features.StatusHeadline{ BaselineHighDate: nil, BaselineLowDate: nil, ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ + Support: web_platform_dx__web_features.Support{ Chrome: nil, ChromeAndroid: nil, Edge: nil, @@ -435,7 +436,7 @@ func TestInsertWebFeatures(t *testing.T) { mockUpsertFeatureSpecCfg mockUpsertFeatureSpecConfig mockPrecalculateBrowserFeatureSupportEventsCfg mockPrecalculateBrowserFeatureSupportEventsConfig mockUpsertFeatureDiscouragedDetailsCfg mockUpsertFeatureDiscouragedDetailsConfig - input map[string]web_platform_dx__web_features.FeatureValue + input webdxfeaturetypes.FeatureKinds expectedError error // Expected error from InsertWebFeatures }{ { @@ -553,73 +554,79 @@ func TestInsertWebFeatures(t *testing.T) { }, expectedCount: 2, }, - input: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: &web_platform_dx__web_features.Discouraged{ - AccordingTo: []string{"according-to-1", "according-to-2"}, - Alternatives: []string{"alternative-1", "alternative-2"}, - }, - Spec: &web_platform_dx__web_features.StringOrStringArray{ - StringArray: []string{"feature1-link1", "feature1-link2"}, - String: nil, - }, - Status: web_platform_dx__web_features.Status{ - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: valuePtr("100"), - ChromeAndroid: valuePtr("104"), - Edge: valuePtr("101"), - Firefox: valuePtr("102"), - FirefoxAndroid: nil, - Safari: valuePtr("103"), - SafariIos: nil, + input: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: &web_platform_dx__web_features.Discouraged{ + AccordingTo: []string{"according-to-1", "according-to-2"}, + Alternatives: []string{"alternative-1", "alternative-2"}, }, - Baseline: &web_platform_dx__web_features.BaselineUnion{ - Enum: valuePtr(web_platform_dx__web_features.High), - Bool: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: &web_platform_dx__web_features.StringOrStrings{ + StringArray: []string{"feature1-link1", "feature1-link2"}, + String: nil, }, + Status: web_platform_dx__web_features.StatusHeadline{ + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: valuePtr("100"), + ChromeAndroid: valuePtr("104"), + Edge: valuePtr("101"), + Firefox: valuePtr("102"), + FirefoxAndroid: nil, + Safari: valuePtr("103"), + SafariIos: nil, + }, + Baseline: &web_platform_dx__web_features.BaselineUnion{ + Enum: valuePtr(web_platform_dx__web_features.High), + Bool: nil, + }, + }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, - }, - "feature2": { - Name: "Feature 2", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: &web_platform_dx__web_features.StringOrStringArray{ - StringArray: nil, - String: valuePtr("feature2-link"), - }, - Status: web_platform_dx__web_features.Status{ - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: valuePtr("202"), - FirefoxAndroid: nil, - Safari: valuePtr("203"), - SafariIos: valuePtr("106"), + "feature2": { + Name: "Feature 2", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: &web_platform_dx__web_features.StringOrStrings{ + StringArray: nil, + String: valuePtr("feature2-link"), }, - Baseline: &web_platform_dx__web_features.BaselineUnion{ - Enum: valuePtr(web_platform_dx__web_features.Low), - Bool: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: valuePtr("202"), + FirefoxAndroid: nil, + Safari: valuePtr("203"), + SafariIos: valuePtr("106"), + }, + Baseline: &web_platform_dx__web_features.BaselineUnion{ + Enum: valuePtr(web_platform_dx__web_features.Low), + Bool: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, mockPrecalculateBrowserFeatureSupportEventsCfg: mockPrecalculateBrowserFeatureSupportEventsConfig{ @@ -675,35 +682,40 @@ func TestInsertWebFeatures(t *testing.T) { outputs: map[string]error{}, expectedCount: 0, }, - input: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, - }, - Baseline: &web_platform_dx__web_features.BaselineUnion{ - Enum: valuePtr(web_platform_dx__web_features.High), - Bool: nil, + input: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, + Baseline: &web_platform_dx__web_features.BaselineUnion{ + Enum: valuePtr(web_platform_dx__web_features.High), + Bool: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, expectedError: ErrSyncWebFeaturesTest, @@ -750,35 +762,40 @@ func TestInsertWebFeatures(t *testing.T) { outputs: map[string]error{}, expectedCount: 0, }, - input: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, - }, - Baseline: &web_platform_dx__web_features.BaselineUnion{ - Enum: valuePtr(web_platform_dx__web_features.High), - Bool: nil, + input: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, + Baseline: &web_platform_dx__web_features.BaselineUnion{ + Enum: valuePtr(web_platform_dx__web_features.High), + Bool: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, mockPrecalculateBrowserFeatureSupportEventsCfg: mockPrecalculateBrowserFeatureSupportEventsConfig{ @@ -845,35 +862,40 @@ func TestInsertWebFeatures(t *testing.T) { outputs: map[string]error{}, expectedCount: 0, }, - input: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: valuePtr("100"), - ChromeAndroid: nil, - Edge: valuePtr("101"), - Firefox: valuePtr("102"), - FirefoxAndroid: nil, - Safari: valuePtr("103"), - SafariIos: nil, - }, - Baseline: &web_platform_dx__web_features.BaselineUnion{ - Enum: valuePtr(web_platform_dx__web_features.High), - Bool: nil, + input: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: valuePtr("100"), + ChromeAndroid: nil, + Edge: valuePtr("101"), + Firefox: valuePtr("102"), + FirefoxAndroid: nil, + Safari: valuePtr("103"), + SafariIos: nil, + }, + Baseline: &web_platform_dx__web_features.BaselineUnion{ + Enum: valuePtr(web_platform_dx__web_features.High), + Bool: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, mockPrecalculateBrowserFeatureSupportEventsCfg: mockPrecalculateBrowserFeatureSupportEventsConfig{ @@ -973,38 +995,43 @@ func TestInsertWebFeatures(t *testing.T) { }, expectedCount: 1, }, - input: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: &web_platform_dx__web_features.StringOrStringArray{ - StringArray: []string{"feature1-link1", "feature1-link2"}, - String: nil, - }, - Status: web_platform_dx__web_features.Status{ - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: valuePtr("100"), - ChromeAndroid: valuePtr("104"), - Edge: valuePtr("101"), - Firefox: valuePtr("102"), - FirefoxAndroid: valuePtr("105"), - Safari: valuePtr("103"), - SafariIos: valuePtr("106"), + input: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: &web_platform_dx__web_features.StringOrStrings{ + StringArray: []string{"feature1-link1", "feature1-link2"}, + String: nil, }, - Baseline: &web_platform_dx__web_features.BaselineUnion{ - Enum: valuePtr(web_platform_dx__web_features.High), - Bool: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: valuePtr("100"), + ChromeAndroid: valuePtr("104"), + Edge: valuePtr("101"), + Firefox: valuePtr("102"), + FirefoxAndroid: valuePtr("105"), + Safari: valuePtr("103"), + SafariIos: valuePtr("106"), + }, + Baseline: &web_platform_dx__web_features.BaselineUnion{ + Enum: valuePtr(web_platform_dx__web_features.High), + Bool: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, mockPrecalculateBrowserFeatureSupportEventsCfg: mockPrecalculateBrowserFeatureSupportEventsConfig{ @@ -1130,70 +1157,76 @@ func TestInsertWebFeatures(t *testing.T) { }, expectedCount: 2, }, - input: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: &web_platform_dx__web_features.StringOrStringArray{ - StringArray: []string{"feature1-link1", "feature1-link2"}, - String: nil, - }, - Status: web_platform_dx__web_features.Status{ - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: valuePtr("100"), - ChromeAndroid: valuePtr("104"), - Edge: valuePtr("101"), - Firefox: valuePtr("102"), - FirefoxAndroid: nil, - Safari: valuePtr("103"), - SafariIos: nil, + input: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: &web_platform_dx__web_features.StringOrStrings{ + StringArray: []string{"feature1-link1", "feature1-link2"}, + String: nil, }, - Baseline: &web_platform_dx__web_features.BaselineUnion{ - Enum: valuePtr(web_platform_dx__web_features.High), - Bool: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: valuePtr("100"), + ChromeAndroid: valuePtr("104"), + Edge: valuePtr("101"), + Firefox: valuePtr("102"), + FirefoxAndroid: nil, + Safari: valuePtr("103"), + SafariIos: nil, + }, + Baseline: &web_platform_dx__web_features.BaselineUnion{ + Enum: valuePtr(web_platform_dx__web_features.High), + Bool: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, - }, - "feature2": { - Name: "Feature 2", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: &web_platform_dx__web_features.StringOrStringArray{ - StringArray: nil, - String: valuePtr("feature2-link"), - }, - Status: web_platform_dx__web_features.Status{ - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: valuePtr("202"), - FirefoxAndroid: nil, - Safari: valuePtr("203"), - SafariIos: valuePtr("106"), + "feature2": { + Name: "Feature 2", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: &web_platform_dx__web_features.StringOrStrings{ + StringArray: nil, + String: valuePtr("feature2-link"), }, - Baseline: &web_platform_dx__web_features.BaselineUnion{ - Enum: valuePtr(web_platform_dx__web_features.Low), - Bool: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: valuePtr("202"), + FirefoxAndroid: nil, + Safari: valuePtr("203"), + SafariIos: valuePtr("106"), + }, + Baseline: &web_platform_dx__web_features.BaselineUnion{ + Enum: valuePtr(web_platform_dx__web_features.Low), + Bool: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, mockPrecalculateBrowserFeatureSupportEventsCfg: mockPrecalculateBrowserFeatureSupportEventsConfig{ diff --git a/lib/gds/datastoreadapters/web_features_consumer.go b/lib/gds/datastoreadapters/web_features_consumer.go index 64e30bbbe..4f03b1784 100644 --- a/lib/gds/datastoreadapters/web_features_consumer.go +++ b/lib/gds/datastoreadapters/web_features_consumer.go @@ -19,7 +19,7 @@ import ( "log/slog" "github.com/GoogleChrome/webstatus.dev/lib/gds" - "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/GoogleChrome/webstatus.dev/lib/webdxfeaturetypes" ) // WebFeatureDatastoreClient expects a subset of the functionality from lib/gds that only apply to WebFeatures. @@ -44,8 +44,8 @@ type WebFeaturesConsumer struct { func (c *WebFeaturesConsumer) InsertWebFeaturesMetadata( ctx context.Context, featureKeyToID map[string]string, - data map[string]web_platform_dx__web_features.FeatureValue) error { - for featureKey, featureData := range data { + data webdxfeaturetypes.FeatureKinds) error { + for featureKey, featureData := range data.Data { featureID, found := featureKeyToID[featureKey] if !found { // Should never happen but let's log it out. diff --git a/lib/gds/datastoreadapters/web_features_consumer_test.go b/lib/gds/datastoreadapters/web_features_consumer_test.go index 46b318cb9..5935c8f4d 100644 --- a/lib/gds/datastoreadapters/web_features_consumer_test.go +++ b/lib/gds/datastoreadapters/web_features_consumer_test.go @@ -22,6 +22,7 @@ import ( "github.com/GoogleChrome/webstatus.dev/lib/gds" "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/GoogleChrome/webstatus.dev/lib/webdxfeaturetypes" ) // MockWebFeatureDatastoreClient allows us to control UpsertFeatureMetadata behavior. @@ -45,7 +46,7 @@ func TestInsertWebFeaturesMetadata(t *testing.T) { testCases := []struct { name string featureKeyToID map[string]string - inputFeatureData map[string]web_platform_dx__web_features.FeatureValue + inputFeatureData webdxfeaturetypes.FeatureKinds expectedUpserts map[string]gds.FeatureMetadata mockClientError error expectedErrorReturn error @@ -53,35 +54,40 @@ func TestInsertWebFeaturesMetadata(t *testing.T) { { name: "Success with single CanIUse ID", featureKeyToID: map[string]string{"feature1": "id1"}, - inputFeatureData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - CompatFeatures: nil, - Name: "feature 1", - Description: "Feature 1 description", - Caniuse: &web_platform_dx__web_features.StringOrStringArray{ - String: valuePtr("caniuse-id1"), - StringArray: nil, - }, - DescriptionHTML: "1", - Discouraged: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + inputFeatureData: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + CompatFeatures: nil, + Name: "feature 1", + Description: "Feature 1 description", + Caniuse: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("caniuse-id1"), + StringArray: nil, + }, + DescriptionHTML: "1", + Kind: web_platform_dx__web_features.Feature, + Discouraged: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Spec: nil, + Group: nil, + Snapshot: nil, }, - Spec: nil, - Group: nil, - Snapshot: nil, }, }, expectedUpserts: map[string]gds.FeatureMetadata{ @@ -93,35 +99,40 @@ func TestInsertWebFeaturesMetadata(t *testing.T) { { name: "Success with multiple CanIUse IDs", featureKeyToID: map[string]string{"feature2": "id2"}, - inputFeatureData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature2": { - CompatFeatures: nil, - Name: "feature 2", - Description: "Feature 2 description", - Discouraged: nil, - Caniuse: &web_platform_dx__web_features.StringOrStringArray{ - String: nil, - StringArray: []string{"caniuse-id2a", "caniuse-id2b"}, - }, - DescriptionHTML: "2", - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + inputFeatureData: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature2": { + CompatFeatures: nil, + Name: "feature 2", + Description: "Feature 2 description", + Discouraged: nil, + Caniuse: &web_platform_dx__web_features.StringOrStrings{ + String: nil, + StringArray: []string{"caniuse-id2a", "caniuse-id2b"}, + }, + DescriptionHTML: "2", + Kind: web_platform_dx__web_features.Feature, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Spec: nil, + Group: nil, + Snapshot: nil, }, - Spec: nil, - Group: nil, - Snapshot: nil, }, }, expectedUpserts: map[string]gds.FeatureMetadata{ @@ -137,32 +148,37 @@ func TestInsertWebFeaturesMetadata(t *testing.T) { { name: "Missing feature ID", featureKeyToID: map[string]string{}, - inputFeatureData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature3": { - Caniuse: nil, - CompatFeatures: nil, - Name: "feature 3", - Description: "Feature 3 description", - DescriptionHTML: "3", - Discouraged: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + inputFeatureData: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature3": { + Caniuse: nil, + CompatFeatures: nil, + Name: "feature 3", + Description: "Feature 3 description", + DescriptionHTML: "3", + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Spec: nil, + Group: nil, + Snapshot: nil, }, - Spec: nil, - Group: nil, - Snapshot: nil, }, }, expectedUpserts: map[string]gds.FeatureMetadata{}, @@ -172,32 +188,37 @@ func TestInsertWebFeaturesMetadata(t *testing.T) { { name: "Upsert error", featureKeyToID: map[string]string{"feature4": "id4"}, - inputFeatureData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature4": { - Caniuse: nil, - CompatFeatures: nil, - Name: "feature 4", - Description: "Feature 4 description", - DescriptionHTML: "4", - Discouraged: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + inputFeatureData: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature4": { + Caniuse: nil, + CompatFeatures: nil, + Name: "feature 4", + Description: "Feature 4 description", + DescriptionHTML: "4", + Kind: web_platform_dx__web_features.Feature, + Discouraged: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Spec: nil, + Group: nil, + Snapshot: nil, }, - Spec: nil, - Group: nil, - Snapshot: nil, }, }, expectedUpserts: map[string]gds.FeatureMetadata{}, diff --git a/lib/webdxfeaturetypes/types.go b/lib/webdxfeaturetypes/types.go new file mode 100644 index 000000000..f614d7514 --- /dev/null +++ b/lib/webdxfeaturetypes/types.go @@ -0,0 +1,24 @@ +package webdxfeaturetypes + +import ( + "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" +) + +// ProcessedWebFeaturesData is the top-level container for the fully parsed and +// transformed data from the web-features package. It represents a clean, +// application-ready view of the data, with features pre-sorted by kind. +type ProcessedWebFeaturesData struct { + Snapshots map[string]web_platform_dx__web_features.SnapshotData + Browsers map[string]web_platform_dx__web_features.BrowserData + Groups map[string]web_platform_dx__web_features.GroupData + Features FeatureKinds +} + +// FeatureKinds is a container that categorizes all parsed web features by +// their specific type. This makes it easy for application logic to consume +// a specific kind of feature without needing to perform type assertions. +type FeatureKinds struct { + Data map[string]web_platform_dx__web_features.FeatureData + Moved map[string]web_platform_dx__web_features.FeatureMovedData + Split map[string]web_platform_dx__web_features.FeatureSplitData +} diff --git a/workflows/steps/services/web_feature_consumer/go.mod b/workflows/steps/services/web_feature_consumer/go.mod index 956e3b6a4..5d652cf48 100644 --- a/workflows/steps/services/web_feature_consumer/go.mod +++ b/workflows/steps/services/web_feature_consumer/go.mod @@ -39,6 +39,7 @@ require ( github.com/go-openapi/swag v0.23.1 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/gomodule/redigo v1.9.2 // indirect + github.com/google/go-cmp v0.7.0 github.com/google/go-github/v73 v73.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/s2a-go v0.1.9 // indirect diff --git a/workflows/steps/services/web_feature_consumer/pkg/data/parser.go b/workflows/steps/services/web_feature_consumer/pkg/data/parser.go index 1a3683ee4..2bb73fb79 100644 --- a/workflows/steps/services/web_feature_consumer/pkg/data/parser.go +++ b/workflows/steps/services/web_feature_consumer/pkg/data/parser.go @@ -21,6 +21,7 @@ import ( "strings" "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/GoogleChrome/webstatus.dev/lib/webdxfeaturetypes" ) // Parser contains the logic to parse the JSON from the web-features Github Release. @@ -28,61 +29,137 @@ type Parser struct{} var ErrUnexpectedFormat = errors.New("unexpected format") +var ErrUnableToProcess = errors.New("unable to process the data") + +// rawWebFeaturesJSONData is used to parse the source JSON. +// It holds the features as raw JSON messages to be processed individually. +type rawWebFeaturesJSONData struct { + Browsers map[string]web_platform_dx__web_features.BrowserData `json:"browsers"` + Features json.RawMessage `json:"features"` + Groups map[string]web_platform_dx__web_features.GroupData `json:"groups"` + Snapshots map[string]web_platform_dx__web_features.SnapshotData `json:"snapshots"` +} + +// featureKindPeek is a small helper struct to find the discriminator value. +type featureKindPeek struct { + Kind string `json:"kind"` +} + // Parse expects the raw bytes for a map of string to // https://github.com/web-platform-dx/web-features/blob/main/schemas/defs.schema.json // The string is the feature ID. // It will consume the readcloser and close it. -func (p Parser) Parse(in io.ReadCloser) (*web_platform_dx__web_features.FeatureData, error) { +func (p Parser) Parse(in io.ReadCloser) (*webdxfeaturetypes.ProcessedWebFeaturesData, error) { defer in.Close() - var ret web_platform_dx__web_features.FeatureData + var source rawWebFeaturesJSONData decoder := json.NewDecoder(in) - err := decoder.Decode(&ret) + err := decoder.Decode(&source) if err != nil { return nil, errors.Join(ErrUnexpectedFormat, err) } - postProcess(&ret) + ret, err := postProcess(&source) + if err != nil { + return nil, errors.Join(ErrUnableToProcess, err) + } - return &ret, nil + return ret, nil } -func postProcess(data *web_platform_dx__web_features.FeatureData) { - postProcessFeatureValue(data.Features) +func postProcess(data *rawWebFeaturesJSONData) (*webdxfeaturetypes.ProcessedWebFeaturesData, error) { + featureKinds, err := postProcessFeatureValue(data.Features) + if err != nil { + return nil, err + } + + return &webdxfeaturetypes.ProcessedWebFeaturesData{ + Browsers: data.Browsers, + Groups: data.Groups, + Features: *featureKinds, + Snapshots: data.Snapshots, + }, nil + } -func postProcessFeatureValue( - data map[string]web_platform_dx__web_features.FeatureValue) { - for id, value := range data { - data[id] = web_platform_dx__web_features.FeatureValue{ - Caniuse: postProcessStringOrStringArray(value.Caniuse), - CompatFeatures: value.CompatFeatures, - Description: value.Description, - DescriptionHTML: value.DescriptionHTML, - Group: postProcessStringOrStringArray(value.Group), - Name: value.Name, - Snapshot: postProcessStringOrStringArray(value.Snapshot), - Spec: postProcessStringOrStringArray(value.Spec), - Status: postProcessStatus(value.Status), - Discouraged: value.Discouraged, +func postProcessFeatureValue(data json.RawMessage) (*webdxfeaturetypes.FeatureKinds, error) { + featureKinds := webdxfeaturetypes.FeatureKinds{ + Data: make(map[string]web_platform_dx__web_features.FeatureData), + Moved: make(map[string]web_platform_dx__web_features.FeatureMovedData), + Split: make(map[string]web_platform_dx__web_features.FeatureSplitData), + } + + featureRawMessageMap := make(map[string]json.RawMessage) + + err := json.Unmarshal(data, &featureRawMessageMap) + if err != nil { + return nil, err + } + + for id, rawFeature := range featureRawMessageMap { + // Peek inside the raw JSON to find the "kind" + var peek featureKindPeek + if err := json.Unmarshal(rawFeature, &peek); err != nil { + // Skip or log features that don't have a 'kind' field + continue + } + + // Switch on the explicit "kind" to unmarshal into the correct type + switch peek.Kind { + case string(web_platform_dx__web_features.Feature): + var value web_platform_dx__web_features.FeatureData + if err := json.Unmarshal(rawFeature, &value); err != nil { + return nil, err + } + // Run your existing post-processing logic + featureKinds.Data[id] = web_platform_dx__web_features.FeatureData{ + Kind: web_platform_dx__web_features.Feature, + Caniuse: postProcessStringOrStrings(value.Caniuse), + CompatFeatures: value.CompatFeatures, + Description: value.Description, + DescriptionHTML: value.DescriptionHTML, + Group: postProcessStringOrStrings(value.Group), + Name: value.Name, + Snapshot: postProcessStringOrStrings(value.Snapshot), + Spec: postProcessStringOrStrings(value.Spec), + Status: postProcessStatus(value.Status), + Discouraged: value.Discouraged, + } + + case string(web_platform_dx__web_features.Moved): + var value web_platform_dx__web_features.FeatureMovedData + if err := json.Unmarshal(rawFeature, &value); err != nil { + return nil, err + } + featureKinds.Moved[id] = value + + case string(web_platform_dx__web_features.Split): + var value web_platform_dx__web_features.FeatureSplitData + if err := json.Unmarshal(rawFeature, &value); err != nil { + return nil, err + } + featureKinds.Split[id] = value } } + + return &featureKinds, nil } -func postProcessStringOrStringArray( - value *web_platform_dx__web_features.StringOrStringArray) *web_platform_dx__web_features.StringOrStringArray { +func postProcessStringOrStrings( + value *web_platform_dx__web_features.StringOrStrings) *web_platform_dx__web_features.StringOrStrings { // Do nothing for now. if value == nil { return nil } - return &web_platform_dx__web_features.StringOrStringArray{ + return &web_platform_dx__web_features.StringOrStrings{ String: value.String, StringArray: value.StringArray, } } -func postProcessStatus(value web_platform_dx__web_features.Status) web_platform_dx__web_features.Status { - return web_platform_dx__web_features.Status{ +func postProcessStatus(value web_platform_dx__web_features.StatusHeadline, +) web_platform_dx__web_features.StatusHeadline { + return web_platform_dx__web_features.StatusHeadline{ Baseline: postProcessBaseline(value.Baseline), BaselineHighDate: postProcessBaselineDates(value.BaselineHighDate), BaselineLowDate: postProcessBaselineDates(value.BaselineLowDate), @@ -122,8 +199,8 @@ func postProcessBaselineSupportBrowser(value *string) *string { } func postProcessBaselineSupport( - value web_platform_dx__web_features.StatusSupport) web_platform_dx__web_features.StatusSupport { - return web_platform_dx__web_features.StatusSupport{ + value web_platform_dx__web_features.Support) web_platform_dx__web_features.Support { + return web_platform_dx__web_features.Support{ Chrome: postProcessBaselineSupportBrowser(value.Chrome), ChromeAndroid: postProcessBaselineSupportBrowser(value.ChromeAndroid), Edge: postProcessBaselineSupportBrowser(value.Edge), diff --git a/workflows/steps/services/web_feature_consumer/pkg/data/parser_test.go b/workflows/steps/services/web_feature_consumer/pkg/data/parser_test.go index a2f93c851..c4813aa63 100644 --- a/workflows/steps/services/web_feature_consumer/pkg/data/parser_test.go +++ b/workflows/steps/services/web_feature_consumer/pkg/data/parser_test.go @@ -15,15 +15,16 @@ package data import ( + "encoding/json" "errors" "io" "os" "path" - "reflect" "strings" "testing" "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/google/go-cmp/cmp" ) func TestParse(t *testing.T) { @@ -37,6 +38,8 @@ func TestParse(t *testing.T) { }, } for _, tc := range testCases { + // TODO, skip until we have a published data.json with v3. We should also check for the different feature kinds + t.Skip() t.Run(tc.name, func(t *testing.T) { file, err := os.Open(tc.path) if err != nil { @@ -46,7 +49,7 @@ func TestParse(t *testing.T) { if err != nil { t.Errorf("unable to parse file err %s", err.Error()) } - if len(result.Features) == 0 { + if len(result.Features.Data) == 0 { t.Error("unexpected empty map for features") } if len(result.Groups) == 0 { @@ -87,52 +90,63 @@ func TestParseError(t *testing.T) { func valuePtr[T any](in T) *T { return &in } +func structToRawMessage[T any](t *testing.T, in T) json.RawMessage { + bytes, err := json.Marshal(in) + if err != nil { + t.Fatalf("unable create json raw message") + } + + return json.RawMessage(bytes) +} + func TestPostProcess(t *testing.T) { testCases := []struct { name string - featureData *web_platform_dx__web_features.FeatureData - expectedFeatureValue web_platform_dx__web_features.FeatureValue + featureData *rawWebFeaturesJSONData + expectedFeatureValue map[string]web_platform_dx__web_features.FeatureData + expectedError error }{ { name: "catch-all case", - featureData: &web_platform_dx__web_features.FeatureData{ - Browsers: web_platform_dx__web_features.Browsers{ - Chrome: web_platform_dx__web_features.BrowserData{ + featureData: &rawWebFeaturesJSONData{ + Browsers: map[string]web_platform_dx__web_features.BrowserData{ + "chrome": { Name: "chrome", Releases: nil, }, - ChromeAndroid: web_platform_dx__web_features.BrowserData{ + "chrome_android": { Name: "chrome_android", Releases: nil, }, - Edge: web_platform_dx__web_features.BrowserData{ + "edge": { Name: "edge", Releases: nil, }, - Firefox: web_platform_dx__web_features.BrowserData{ + "firefox": { Name: "firefox", Releases: nil, }, - FirefoxAndroid: web_platform_dx__web_features.BrowserData{ + "firefox_android": { Name: "firefox_android", Releases: nil, }, - Safari: web_platform_dx__web_features.BrowserData{ + "safari": { Name: "safari", Releases: nil, }, - SafariIos: web_platform_dx__web_features.BrowserData{ + "safari_ios": { Name: "safari_ios", Releases: nil, }, }, Groups: nil, Snapshots: nil, - Features: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { + Features: structToRawMessage(t, map[string]interface{}{ + "feature1": web_platform_dx__web_features.FeatureData{ CompatFeatures: []string{"compat1", "compat2"}, Description: "description", DescriptionHTML: "description html", + Kind: web_platform_dx__web_features.Feature, Discouraged: &web_platform_dx__web_features.Discouraged{ AccordingTo: []string{ "discouraged1", @@ -144,43 +158,88 @@ func TestPostProcess(t *testing.T) { }, }, Name: "feature 1 name", - Caniuse: &web_platform_dx__web_features.StringOrStringArray{ - String: valuePtr("caniuse_data"), + Caniuse: &web_platform_dx__web_features.StringOrStrings{ + String: nil, StringArray: []string{ "caniuse1", "caniuse2", }, }, - Group: &web_platform_dx__web_features.StringOrStringArray{ - String: valuePtr("group_name"), - StringArray: []string{ - "group1", - "group2", + Group: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("group_name"), + StringArray: nil, + }, + Snapshot: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("snapshot_data"), + StringArray: nil, + }, + Spec: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("spec_link"), + StringArray: nil, + }, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: &web_platform_dx__web_features.BaselineUnion{ + Bool: valuePtr(false), + Enum: nil, + }, + BaselineHighDate: valuePtr("≤2023-01-01"), + BaselineLowDate: valuePtr("≤2022-12-01"), + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: valuePtr("≤99"), + ChromeAndroid: valuePtr("≤98"), + Firefox: valuePtr("≤97"), + FirefoxAndroid: valuePtr("≤96"), + Edge: valuePtr("≤95"), + Safari: valuePtr("≤94"), + SafariIos: valuePtr("≤93"), }, }, - Snapshot: &web_platform_dx__web_features.StringOrStringArray{ - String: valuePtr("snapshot_data"), - StringArray: []string{ - "snapshot1", - "snapshot2", + }, + "feature2": web_platform_dx__web_features.FeatureData{ + CompatFeatures: []string{"compat1", "compat2"}, + Description: "description", + DescriptionHTML: "description html", + Kind: web_platform_dx__web_features.Feature, + Discouraged: &web_platform_dx__web_features.Discouraged{ + AccordingTo: []string{ + "discouraged1", + "discouraged2", + }, + Alternatives: []string{ + "feature2", + "feature3", }, }, - Spec: &web_platform_dx__web_features.StringOrStringArray{ - String: valuePtr("spec_link"), + Name: "feature 2 name", + Caniuse: &web_platform_dx__web_features.StringOrStrings{ + String: nil, StringArray: []string{ - "spec1", - "spec2", + "caniuse1", + "caniuse2", }, }, - Status: web_platform_dx__web_features.Status{ + Group: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("group_name"), + StringArray: nil, + }, + Snapshot: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("snapshot_data"), + StringArray: nil, + }, + Spec: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("spec_link"), + StringArray: nil, + }, + Status: web_platform_dx__web_features.StatusHeadline{ Baseline: &web_platform_dx__web_features.BaselineUnion{ - Bool: valuePtr(false), + Bool: nil, Enum: valuePtr(web_platform_dx__web_features.High), }, BaselineHighDate: valuePtr("≤2023-01-01"), BaselineLowDate: valuePtr("≤2022-12-01"), ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ + Support: web_platform_dx__web_features.Support{ Chrome: valuePtr("≤99"), ChromeAndroid: valuePtr("≤98"), Firefox: valuePtr("≤97"), @@ -191,67 +250,116 @@ func TestPostProcess(t *testing.T) { }, }, }, - }, + }), }, - expectedFeatureValue: web_platform_dx__web_features.FeatureValue{ - CompatFeatures: []string{"compat1", "compat2"}, - Description: "description", - DescriptionHTML: "description html", - Discouraged: &web_platform_dx__web_features.Discouraged{ - AccordingTo: []string{ - "discouraged1", - "discouraged2", + expectedError: nil, + expectedFeatureValue: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + CompatFeatures: []string{"compat1", "compat2"}, + Kind: web_platform_dx__web_features.Feature, + Description: "description", + DescriptionHTML: "description html", + Discouraged: &web_platform_dx__web_features.Discouraged{ + AccordingTo: []string{ + "discouraged1", + "discouraged2", + }, + Alternatives: []string{ + "feature2", + "feature3", + }, }, - Alternatives: []string{ - "feature2", - "feature3", + Name: "feature 1 name", + Caniuse: &web_platform_dx__web_features.StringOrStrings{ + String: nil, + StringArray: []string{ + "caniuse1", + "caniuse2", + }, }, - }, - Name: "feature 1 name", - Caniuse: &web_platform_dx__web_features.StringOrStringArray{ - String: valuePtr("caniuse_data"), - StringArray: []string{ - "caniuse1", - "caniuse2", + Group: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("group_name"), + StringArray: nil, }, - }, - Group: &web_platform_dx__web_features.StringOrStringArray{ - String: valuePtr("group_name"), - StringArray: []string{ - "group1", - "group2", + Snapshot: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("snapshot_data"), + StringArray: nil, }, - }, - Snapshot: &web_platform_dx__web_features.StringOrStringArray{ - String: valuePtr("snapshot_data"), - StringArray: []string{ - "snapshot1", - "snapshot2", + Spec: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("spec_link"), + StringArray: nil, }, - }, - Spec: &web_platform_dx__web_features.StringOrStringArray{ - String: valuePtr("spec_link"), - StringArray: []string{ - "spec1", - "spec2", + Status: web_platform_dx__web_features.StatusHeadline{ + ByCompatKey: nil, + Baseline: &web_platform_dx__web_features.BaselineUnion{ + Bool: valuePtr(false), + Enum: nil, + }, + BaselineHighDate: valuePtr("2023-01-01"), + BaselineLowDate: valuePtr("2022-12-01"), + Support: web_platform_dx__web_features.Support{ + Chrome: valuePtr("99"), + ChromeAndroid: valuePtr("98"), + Firefox: valuePtr("97"), + FirefoxAndroid: valuePtr("96"), + Edge: valuePtr("95"), + Safari: valuePtr("94"), + SafariIos: valuePtr("93"), + }, }, }, - Status: web_platform_dx__web_features.Status{ - ByCompatKey: nil, - Baseline: &web_platform_dx__web_features.BaselineUnion{ - Bool: valuePtr(false), - Enum: valuePtr(web_platform_dx__web_features.High), + "feature2": { + CompatFeatures: []string{"compat1", "compat2"}, + Kind: web_platform_dx__web_features.Feature, + Description: "description", + DescriptionHTML: "description html", + Discouraged: &web_platform_dx__web_features.Discouraged{ + AccordingTo: []string{ + "discouraged1", + "discouraged2", + }, + Alternatives: []string{ + "feature2", + "feature3", + }, + }, + Name: "feature 2 name", + Caniuse: &web_platform_dx__web_features.StringOrStrings{ + String: nil, + StringArray: []string{ + "caniuse1", + "caniuse2", + }, }, - BaselineHighDate: valuePtr("2023-01-01"), - BaselineLowDate: valuePtr("2022-12-01"), - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: valuePtr("99"), - ChromeAndroid: valuePtr("98"), - Firefox: valuePtr("97"), - FirefoxAndroid: valuePtr("96"), - Edge: valuePtr("95"), - Safari: valuePtr("94"), - SafariIos: valuePtr("93"), + Group: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("group_name"), + StringArray: nil, + }, + Snapshot: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("snapshot_data"), + StringArray: nil, + }, + Spec: &web_platform_dx__web_features.StringOrStrings{ + String: valuePtr("spec_link"), + StringArray: nil, + }, + Status: web_platform_dx__web_features.StatusHeadline{ + ByCompatKey: nil, + Baseline: &web_platform_dx__web_features.BaselineUnion{ + Bool: nil, + Enum: valuePtr(web_platform_dx__web_features.High), + }, + BaselineHighDate: valuePtr("2023-01-01"), + BaselineLowDate: valuePtr("2022-12-01"), + Support: web_platform_dx__web_features.Support{ + Chrome: valuePtr("99"), + ChromeAndroid: valuePtr("98"), + Firefox: valuePtr("97"), + FirefoxAndroid: valuePtr("96"), + Edge: valuePtr("95"), + Safari: valuePtr("94"), + SafariIos: valuePtr("93"), + }, }, }, }, @@ -260,10 +368,12 @@ func TestPostProcess(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - postProcess(tc.featureData) - featureValue := tc.featureData.Features["feature1"] - if !reflect.DeepEqual(featureValue, tc.expectedFeatureValue) { - t.Errorf("FeatureValue not as expected") + ret, err := postProcess(tc.featureData) + if !errors.Is(err, tc.expectedError) { + t.Errorf("unexpected error: %s", err) + } + if diff := cmp.Diff(tc.expectedFeatureValue, ret.Features.Data); diff != "" { + t.Errorf("FeatureValue not as expected (-want +got):\n%s", diff) } }) } diff --git a/workflows/steps/services/web_feature_consumer/pkg/workflow/web_features_worker.go b/workflows/steps/services/web_feature_consumer/pkg/workflow/web_features_worker.go index 9aaa0ee21..7ca173c58 100644 --- a/workflows/steps/services/web_feature_consumer/pkg/workflow/web_features_worker.go +++ b/workflows/steps/services/web_feature_consumer/pkg/workflow/web_features_worker.go @@ -22,6 +22,7 @@ import ( "time" "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/GoogleChrome/webstatus.dev/lib/webdxfeaturetypes" ) // AssetGetter describes the behavior to get a certain asset from a github release. @@ -35,14 +36,14 @@ type AssetGetter interface { // AssetParser describes the behavior to parse the io.ReadCloser from AssetGetter into the expected data type. type AssetParser interface { - Parse(io.ReadCloser) (*web_platform_dx__web_features.FeatureData, error) + Parse(io.ReadCloser) (*webdxfeaturetypes.ProcessedWebFeaturesData, error) } // WebFeatureStorer describes the logic to insert the web features that were returned by the AssetParser. type WebFeatureStorer interface { InsertWebFeatures( ctx context.Context, - data map[string]web_platform_dx__web_features.FeatureValue, + data webdxfeaturetypes.FeatureKinds, startAt time.Time, endAt time.Time) (map[string]string, error) } @@ -52,14 +53,14 @@ type WebFeatureMetadataStorer interface { InsertWebFeaturesMetadata( ctx context.Context, featureKeyToID map[string]string, - data map[string]web_platform_dx__web_features.FeatureValue) error + data webdxfeaturetypes.FeatureKinds) error } // WebDXGroupStorer describes the logic to insert the groups that were returned by the AssetParser. type WebDXGroupStorer interface { InsertWebFeatureGroups( ctx context.Context, - featureData map[string]web_platform_dx__web_features.FeatureValue, + featureData webdxfeaturetypes.FeatureKinds, groupData map[string]web_platform_dx__web_features.GroupData) error } @@ -68,7 +69,7 @@ type WebDXSnapshotStorer interface { InsertWebFeatureSnapshots( ctx context.Context, featureKeyToID map[string]string, - featureData map[string]web_platform_dx__web_features.FeatureValue, + featureData webdxfeaturetypes.FeatureKinds, snapshotData map[string]web_platform_dx__web_features.SnapshotData) error } diff --git a/workflows/steps/services/web_feature_consumer/pkg/workflow/web_features_worker_test.go b/workflows/steps/services/web_feature_consumer/pkg/workflow/web_features_worker_test.go index 28753b136..98b08f558 100644 --- a/workflows/steps/services/web_feature_consumer/pkg/workflow/web_features_worker_test.go +++ b/workflows/steps/services/web_feature_consumer/pkg/workflow/web_features_worker_test.go @@ -25,6 +25,7 @@ import ( "time" "github.com/GoogleChrome/webstatus.dev/lib/gen/jsonschema/web_platform_dx__web_features" + "github.com/GoogleChrome/webstatus.dev/lib/webdxfeaturetypes" ) var ( @@ -67,11 +68,11 @@ type mockAssetParser struct { type mockParseConfig struct { expectedFileContents string - returnData *web_platform_dx__web_features.FeatureData + returnData *webdxfeaturetypes.ProcessedWebFeaturesData returnError error } -func (m *mockAssetParser) Parse(file io.ReadCloser) (*web_platform_dx__web_features.FeatureData, error) { +func (m *mockAssetParser) Parse(file io.ReadCloser) (*webdxfeaturetypes.ProcessedWebFeaturesData, error) { defer file.Close() fileContents, err := io.ReadAll(file) if err != nil { @@ -88,32 +89,32 @@ func (m *mockAssetParser) Parse(file io.ReadCloser) (*web_platform_dx__web_featu var ( testInsertWebFeaturesStartAt = time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC) testInsertWebFeaturesEndAt = time.Date(3000, 1, 1, 0, 0, 0, 0, time.UTC) - fakeBrowsersData = web_platform_dx__web_features.Browsers{ - Chrome: web_platform_dx__web_features.BrowserData{ + fakeBrowsersData = map[string]web_platform_dx__web_features.BrowserData{ + "chrome": { Name: "chrome", Releases: nil, }, - ChromeAndroid: web_platform_dx__web_features.BrowserData{ + "chrome_android": { Name: "chrome_android", Releases: nil, }, - Edge: web_platform_dx__web_features.BrowserData{ + "edge": { Name: "edge", Releases: nil, }, - Firefox: web_platform_dx__web_features.BrowserData{ + "firefox": { Name: "firefox", Releases: nil, }, - FirefoxAndroid: web_platform_dx__web_features.BrowserData{ + "firefox_android": { Name: "firefox_android", Releases: nil, }, - Safari: web_platform_dx__web_features.BrowserData{ + "safari": { Name: "safari", Releases: nil, }, - SafariIos: web_platform_dx__web_features.BrowserData{ + "safari_ios": { Name: "safari_ios", Releases: nil, }, @@ -121,7 +122,7 @@ var ( ) type mockInsertWebFeaturesConfig struct { - expectedData map[string]web_platform_dx__web_features.FeatureValue + expectedData *webdxfeaturetypes.FeatureKinds returnedMapping map[string]string returnError error } @@ -132,7 +133,7 @@ type mockWebFeatureStorer struct { } func (m *mockWebFeatureStorer) InsertWebFeatures( - _ context.Context, data map[string]web_platform_dx__web_features.FeatureValue, + _ context.Context, data webdxfeaturetypes.FeatureKinds, startAt, endAt time.Time) (map[string]string, error) { if !reflect.DeepEqual(data, m.mockInsertWebFeaturesCfg.expectedData) { m.t.Error("unexpected data") @@ -148,7 +149,7 @@ func (m *mockWebFeatureStorer) InsertWebFeatures( } type mockInsertWebFeaturesMetadataConfig struct { - expectedData map[string]web_platform_dx__web_features.FeatureValue + expectedData *webdxfeaturetypes.FeatureKinds expectedMapping map[string]string returnError error } @@ -161,7 +162,7 @@ type mockWebFeatureMetadataStorer struct { func (m *mockWebFeatureMetadataStorer) InsertWebFeaturesMetadata( _ context.Context, featureKeyToID map[string]string, - data map[string]web_platform_dx__web_features.FeatureValue) error { + data webdxfeaturetypes.FeatureKinds) error { if !reflect.DeepEqual(data, m.mockInsertWebFeaturesMetadataCfg.expectedData) || !reflect.DeepEqual(featureKeyToID, m.mockInsertWebFeaturesMetadataCfg.expectedMapping) { m.t.Error("unexpected input") @@ -171,7 +172,7 @@ func (m *mockWebFeatureMetadataStorer) InsertWebFeaturesMetadata( } type mockInsertWebFeatureGroupsConfig struct { - expectedFeatureData map[string]web_platform_dx__web_features.FeatureValue + expectedFeatureData *webdxfeaturetypes.FeatureKinds expectedGroupData map[string]web_platform_dx__web_features.GroupData returnError error } @@ -183,7 +184,7 @@ type mockWebFeatureGroupStorer struct { func (m *mockWebFeatureGroupStorer) InsertWebFeatureGroups( _ context.Context, - featureData map[string]web_platform_dx__web_features.FeatureValue, + featureData webdxfeaturetypes.FeatureKinds, groupData map[string]web_platform_dx__web_features.GroupData) error { if !reflect.DeepEqual(featureData, m.mockInsertWebFeatureGroupsCfg.expectedFeatureData) || !reflect.DeepEqual(groupData, m.mockInsertWebFeatureGroupsCfg.expectedGroupData) { @@ -194,7 +195,7 @@ func (m *mockWebFeatureGroupStorer) InsertWebFeatureGroups( } type mockInsertWebFeatureSnapshotsConfig struct { - expectedFeatureData map[string]web_platform_dx__web_features.FeatureValue + expectedFeatureData *webdxfeaturetypes.FeatureKinds expectedSnapshotData map[string]web_platform_dx__web_features.SnapshotData expectedMapping map[string]string returnError error @@ -208,7 +209,7 @@ type mockWebFeatureSnapshotStorer struct { func (m *mockWebFeatureSnapshotStorer) InsertWebFeatureSnapshots( _ context.Context, featureKeyToID map[string]string, - featureData map[string]web_platform_dx__web_features.FeatureValue, + featureData webdxfeaturetypes.FeatureKinds, snapshotData map[string]web_platform_dx__web_features.SnapshotData) error { if !reflect.DeepEqual(featureData, m.mockInsertWebFeatureSnapshotCfg.expectedFeatureData) || !reflect.DeepEqual(snapshotData, m.mockInsertWebFeatureSnapshotCfg.expectedSnapshotData) || @@ -248,21 +249,74 @@ func TestProcess(t *testing.T) { }, mockParseCfg: mockParseConfig{ expectedFileContents: "hi features", - returnData: &web_platform_dx__web_features.FeatureData{ + returnData: &webdxfeaturetypes.ProcessedWebFeaturesData{ Browsers: fakeBrowsersData, - Features: map[string]web_platform_dx__web_features.FeatureValue{ + Features: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, + }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, + }, + }, + }, + Groups: map[string]web_platform_dx__web_features.GroupData{ + "group1": { + Name: "Group 1", + Parent: nil, + }, + }, + Snapshots: map[string]web_platform_dx__web_features.SnapshotData{ + "snapshot1": { + Name: "Snapshot 1", + Spec: "", + }, + }, + }, + returnError: nil, + }, + mockInsertWebFeaturesCfg: mockInsertWebFeaturesConfig{ + expectedData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ "feature1": { Name: "Feature 1", Caniuse: nil, CompatFeatures: nil, Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, Spec: nil, - Status: web_platform_dx__web_features.Status{ + Status: web_platform_dx__web_features.StatusHeadline{ Baseline: nil, BaselineHighDate: nil, BaselineLowDate: nil, ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ + Support: web_platform_dx__web_features.Support{ Chrome: nil, ChromeAndroid: nil, Edge: nil, @@ -278,49 +332,6 @@ func TestProcess(t *testing.T) { Snapshot: nil, }, }, - Groups: map[string]web_platform_dx__web_features.GroupData{ - "group1": { - Name: "Group 1", - Parent: nil, - }, - }, - Snapshots: map[string]web_platform_dx__web_features.SnapshotData{ - "snapshot1": { - Name: "Snapshot 1", - Spec: "", - }, - }, - }, - returnError: nil, - }, - mockInsertWebFeaturesCfg: mockInsertWebFeaturesConfig{ - expectedData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, - }, - }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, - }, }, returnedMapping: map[string]string{ "feature1": "id-1", @@ -328,32 +339,37 @@ func TestProcess(t *testing.T) { returnError: nil, }, mockInsertWebFeaturesMetadataCfg: mockInsertWebFeaturesMetadataConfig{ - expectedData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + expectedData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, expectedMapping: map[string]string{ @@ -362,32 +378,37 @@ func TestProcess(t *testing.T) { returnError: nil, }, mockInsertWebFeatureGroupsCfg: mockInsertWebFeatureGroupsConfig{ - expectedFeatureData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + expectedFeatureData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, expectedGroupData: map[string]web_platform_dx__web_features.GroupData{ @@ -399,32 +420,37 @@ func TestProcess(t *testing.T) { returnError: nil, }, mockInsertWebFeatureSnapshotsCfg: mockInsertWebFeatureSnapshotsConfig{ - expectedFeatureData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + expectedFeatureData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, expectedMapping: map[string]string{ @@ -525,21 +551,64 @@ func TestProcess(t *testing.T) { }, mockParseCfg: mockParseConfig{ expectedFileContents: "hi features", - returnData: &web_platform_dx__web_features.FeatureData{ + returnData: &webdxfeaturetypes.ProcessedWebFeaturesData{ Browsers: fakeBrowsersData, - Features: map[string]web_platform_dx__web_features.FeatureValue{ + Features: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, + }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, + }, + }, + }, + Groups: nil, + Snapshots: nil, + }, + returnError: nil, + }, + mockInsertWebFeaturesCfg: mockInsertWebFeaturesConfig{ + expectedData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ "feature1": { Name: "Feature 1", Caniuse: nil, CompatFeatures: nil, Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, Spec: nil, - Status: web_platform_dx__web_features.Status{ + Status: web_platform_dx__web_features.StatusHeadline{ Baseline: nil, BaselineHighDate: nil, BaselineLowDate: nil, ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ + Support: web_platform_dx__web_features.Support{ Chrome: nil, ChromeAndroid: nil, Edge: nil, @@ -555,39 +624,6 @@ func TestProcess(t *testing.T) { Snapshot: nil, }, }, - Groups: nil, - Snapshots: nil, - }, - returnError: nil, - }, - mockInsertWebFeaturesCfg: mockInsertWebFeaturesConfig{ - expectedData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, - }, - }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, - }, }, returnedMapping: map[string]string{ "feature1": "id-1", @@ -623,21 +659,64 @@ func TestProcess(t *testing.T) { }, mockParseCfg: mockParseConfig{ expectedFileContents: "hi features", - returnData: &web_platform_dx__web_features.FeatureData{ + returnData: &webdxfeaturetypes.ProcessedWebFeaturesData{ Browsers: fakeBrowsersData, - Features: map[string]web_platform_dx__web_features.FeatureValue{ + Features: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, + }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, + }, + }, + }, + Groups: nil, + Snapshots: nil, + }, + returnError: nil, + }, + mockInsertWebFeaturesCfg: mockInsertWebFeaturesConfig{ + expectedData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ "feature1": { Name: "Feature 1", Caniuse: nil, CompatFeatures: nil, Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, Spec: nil, - Status: web_platform_dx__web_features.Status{ + Status: web_platform_dx__web_features.StatusHeadline{ Baseline: nil, BaselineHighDate: nil, BaselineLowDate: nil, ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ + Support: web_platform_dx__web_features.Support{ Chrome: nil, ChromeAndroid: nil, Edge: nil, @@ -653,39 +732,6 @@ func TestProcess(t *testing.T) { Snapshot: nil, }, }, - Groups: nil, - Snapshots: nil, - }, - returnError: nil, - }, - mockInsertWebFeaturesCfg: mockInsertWebFeaturesConfig{ - expectedData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, - }, - }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, - }, }, returnedMapping: map[string]string{ "feature1": "id-1", @@ -693,32 +739,37 @@ func TestProcess(t *testing.T) { returnError: nil, }, mockInsertWebFeaturesMetadataCfg: mockInsertWebFeaturesMetadataConfig{ - expectedData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + expectedData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, expectedMapping: map[string]string{ @@ -750,21 +801,69 @@ func TestProcess(t *testing.T) { }, mockParseCfg: mockParseConfig{ expectedFileContents: "hi features", - returnData: &web_platform_dx__web_features.FeatureData{ + returnData: &webdxfeaturetypes.ProcessedWebFeaturesData{ Browsers: fakeBrowsersData, - Features: map[string]web_platform_dx__web_features.FeatureValue{ + Features: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, + }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, + }, + }, + }, + Groups: map[string]web_platform_dx__web_features.GroupData{ + "group1": { + Name: "Group 1", + Parent: nil, + }, + }, + Snapshots: nil, + }, + returnError: nil, + }, + mockInsertWebFeaturesCfg: mockInsertWebFeaturesConfig{ + expectedData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ "feature1": { Name: "Feature 1", Caniuse: nil, CompatFeatures: nil, Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, Spec: nil, - Status: web_platform_dx__web_features.Status{ + Status: web_platform_dx__web_features.StatusHeadline{ Baseline: nil, BaselineHighDate: nil, BaselineLowDate: nil, ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ + Support: web_platform_dx__web_features.Support{ Chrome: nil, ChromeAndroid: nil, Edge: nil, @@ -780,44 +879,6 @@ func TestProcess(t *testing.T) { Snapshot: nil, }, }, - Groups: map[string]web_platform_dx__web_features.GroupData{ - "group1": { - Name: "Group 1", - Parent: nil, - }, - }, - Snapshots: nil, - }, - returnError: nil, - }, - mockInsertWebFeaturesCfg: mockInsertWebFeaturesConfig{ - expectedData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, - }, - }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, - }, }, returnedMapping: map[string]string{ "feature1": "id-1", @@ -825,32 +886,37 @@ func TestProcess(t *testing.T) { returnError: nil, }, mockInsertWebFeaturesMetadataCfg: mockInsertWebFeaturesMetadataConfig{ - expectedData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + expectedData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, expectedMapping: map[string]string{ @@ -859,32 +925,37 @@ func TestProcess(t *testing.T) { returnError: nil, }, mockInsertWebFeatureGroupsCfg: mockInsertWebFeatureGroupsConfig{ - expectedFeatureData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + expectedFeatureData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, expectedGroupData: map[string]web_platform_dx__web_features.GroupData{ @@ -914,21 +985,74 @@ func TestProcess(t *testing.T) { }, mockParseCfg: mockParseConfig{ expectedFileContents: "hi features", - returnData: &web_platform_dx__web_features.FeatureData{ + returnData: &webdxfeaturetypes.ProcessedWebFeaturesData{ Browsers: fakeBrowsersData, - Features: map[string]web_platform_dx__web_features.FeatureValue{ + Features: webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, + }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, + }, + }, + }, + Groups: map[string]web_platform_dx__web_features.GroupData{ + "group1": { + Name: "Group 1", + Parent: nil, + }, + }, + Snapshots: map[string]web_platform_dx__web_features.SnapshotData{ + "snapshot1": { + Name: "Snapshot 1", + Spec: "", + }, + }, + }, + returnError: nil, + }, + mockInsertWebFeaturesCfg: mockInsertWebFeaturesConfig{ + expectedData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ "feature1": { Name: "Feature 1", Caniuse: nil, CompatFeatures: nil, Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, Spec: nil, - Status: web_platform_dx__web_features.Status{ + Status: web_platform_dx__web_features.StatusHeadline{ Baseline: nil, BaselineHighDate: nil, BaselineLowDate: nil, ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ + Support: web_platform_dx__web_features.Support{ Chrome: nil, ChromeAndroid: nil, Edge: nil, @@ -944,49 +1068,6 @@ func TestProcess(t *testing.T) { Snapshot: nil, }, }, - Groups: map[string]web_platform_dx__web_features.GroupData{ - "group1": { - Name: "Group 1", - Parent: nil, - }, - }, - Snapshots: map[string]web_platform_dx__web_features.SnapshotData{ - "snapshot1": { - Name: "Snapshot 1", - Spec: "", - }, - }, - }, - returnError: nil, - }, - mockInsertWebFeaturesCfg: mockInsertWebFeaturesConfig{ - expectedData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, - }, - }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, - }, }, returnedMapping: map[string]string{ "feature1": "id-1", @@ -994,32 +1075,37 @@ func TestProcess(t *testing.T) { returnError: nil, }, mockInsertWebFeaturesMetadataCfg: mockInsertWebFeaturesMetadataConfig{ - expectedData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + expectedData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, expectedMapping: map[string]string{ @@ -1028,32 +1114,37 @@ func TestProcess(t *testing.T) { returnError: nil, }, mockInsertWebFeatureGroupsCfg: mockInsertWebFeatureGroupsConfig{ - expectedFeatureData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + expectedFeatureData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, expectedGroupData: map[string]web_platform_dx__web_features.GroupData{ @@ -1065,32 +1156,37 @@ func TestProcess(t *testing.T) { returnError: nil, }, mockInsertWebFeatureSnapshotsCfg: mockInsertWebFeatureSnapshotsConfig{ - expectedFeatureData: map[string]web_platform_dx__web_features.FeatureValue{ - "feature1": { - Name: "Feature 1", - Caniuse: nil, - CompatFeatures: nil, - Discouraged: nil, - Spec: nil, - Status: web_platform_dx__web_features.Status{ - Baseline: nil, - BaselineHighDate: nil, - BaselineLowDate: nil, - ByCompatKey: nil, - Support: web_platform_dx__web_features.StatusSupport{ - Chrome: nil, - ChromeAndroid: nil, - Edge: nil, - Firefox: nil, - FirefoxAndroid: nil, - Safari: nil, - SafariIos: nil, + expectedFeatureData: &webdxfeaturetypes.FeatureKinds{ + Moved: nil, + Split: nil, + Data: map[string]web_platform_dx__web_features.FeatureData{ + "feature1": { + Name: "Feature 1", + Caniuse: nil, + CompatFeatures: nil, + Discouraged: nil, + Kind: web_platform_dx__web_features.Feature, + Spec: nil, + Status: web_platform_dx__web_features.StatusHeadline{ + Baseline: nil, + BaselineHighDate: nil, + BaselineLowDate: nil, + ByCompatKey: nil, + Support: web_platform_dx__web_features.Support{ + Chrome: nil, + ChromeAndroid: nil, + Edge: nil, + Firefox: nil, + FirefoxAndroid: nil, + Safari: nil, + SafariIos: nil, + }, }, + Description: "text", + DescriptionHTML: "", + Group: nil, + Snapshot: nil, }, - Description: "text", - DescriptionHTML: "", - Group: nil, - Snapshot: nil, }, }, expectedMapping: map[string]string{