github.com/web-platform-tests/wpt.fyi@v0.0.0-20240530210107-70cf978996f1/shared/web_features_test.go (about)

     1  // Copyright 2024 The WPT Dashboard Project. All rights reserved.
     2  // Use of this source code is governed by a BSD-style license that can be
     3  // found in the LICENSE file.
     4  
     5  //go:build small
     6  
     7  package shared
     8  
     9  import (
    10  	"context"
    11  	"errors"
    12  	"io"
    13  	"strings"
    14  	"testing"
    15  
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  func TestWebFeaturesData_TestMatchesWithWebFeature(t *testing.T) {
    20  	// Test cases for TestMatchesWithWebFeature
    21  	tests := []struct {
    22  		name       string
    23  		data       WebFeaturesData
    24  		test       string
    25  		webFeature string
    26  		expected   bool
    27  	}{
    28  		{
    29  			name:       "test matches with web feature",
    30  			data:       WebFeaturesData{"test1": map[string]interface{}{"feature1": nil, "feature2": nil}},
    31  			test:       "test1",
    32  			webFeature: "feature1",
    33  			expected:   true,
    34  		},
    35  		{
    36  			name:       "test doesn't match with web feature",
    37  			data:       WebFeaturesData{"test1": map[string]interface{}{"feature1": nil, "feature2": nil}},
    38  			test:       "test1",
    39  			webFeature: "feature3",
    40  			expected:   false,
    41  		},
    42  		{
    43  			name:       "test not present in data",
    44  			data:       WebFeaturesData{},
    45  			test:       "test1",
    46  			webFeature: "feature1",
    47  			expected:   false,
    48  		},
    49  	}
    50  
    51  	for _, tc := range tests {
    52  		t.Run(tc.name, func(t *testing.T) {
    53  			result := tc.data.TestMatchesWithWebFeature(tc.test, tc.webFeature)
    54  			assert.Equal(t, result, tc.expected)
    55  		})
    56  	}
    57  }
    58  
    59  func TestWebFeaturesManifestJSONParser_Parse(t *testing.T) {
    60  	// Test cases for Parse
    61  	tests := []struct {
    62  		name          string
    63  		inputJSON     string
    64  		expectedData  WebFeaturesData
    65  		expectedError error
    66  	}{
    67  		{
    68  			name:      "valid manifest version 1",
    69  			inputJSON: `{"version": 1, "data": {"feature1": ["/test1", "/test2"], "feature2": ["/test1", "/test3"]}}`,
    70  			expectedData: WebFeaturesData{
    71  				"/test1": map[string]interface{}{
    72  					"feature1": nil,
    73  					"feature2": nil,
    74  				},
    75  				"/test2": map[string]interface{}{
    76  					"feature1": nil,
    77  				},
    78  				"/test3": map[string]interface{}{
    79  					"feature2": nil,
    80  				},
    81  			},
    82  			expectedError: nil,
    83  		},
    84  		{
    85  			name:          "invalid manifest JSON",
    86  			inputJSON:     `{"version": 1, "data": invalid}`,
    87  			expectedData:  nil,
    88  			expectedError: errBadWebFeaturesManifestJSON,
    89  		},
    90  		{
    91  			name:          "invalid manifest v1 JSON",
    92  			inputJSON:     `{"version": 1, "data": "invalid"}`,
    93  			expectedData:  nil,
    94  			expectedError: errUnexpectedWebFeaturesManifestV1Format,
    95  		},
    96  		{
    97  			name:          "unknown manifest version",
    98  			inputJSON:     `{"version": 2}`,
    99  			expectedData:  nil,
   100  			expectedError: errUnknownWebFeaturesManifestVersion,
   101  		},
   102  	}
   103  
   104  	for _, tc := range tests {
   105  		t.Run(tc.name, func(t *testing.T) {
   106  			parser := webFeaturesManifestJSONParser{}
   107  			r := io.NopCloser(strings.NewReader(tc.inputJSON))
   108  			data, err := parser.Parse(context.Background(), r)
   109  			if !errors.Is(err, tc.expectedError) {
   110  				t.Errorf("Parse() returned unexpected error: (%v). expected error: (%v).", err, tc.expectedError)
   111  			}
   112  			assert.Equal(t, tc.expectedData, data)
   113  		})
   114  	}
   115  }
   116  
   117  func TestWebFeaturesManifestV1Data_prepareTestWebFeatureFilter(t *testing.T) {
   118  	// Test cases for prepareTestWebFeatureFilter
   119  	data := webFeaturesManifestV1Data{
   120  		"feature1": []string{
   121  			"/test1",
   122  			"/test2",
   123  		},
   124  		"feature2": []string{
   125  			"/test2",
   126  		}}
   127  	expectedResult := WebFeaturesData{
   128  		"/test1": {"feature1": nil},
   129  		"/test2": {"feature1": nil, "feature2": nil},
   130  	}
   131  	result := data.prepareTestWebFeatureFilter()
   132  	assert.Equal(t, expectedResult, result)
   133  }