github.com/web-platform-tests/wpt.fyi@v0.0.0-20240530210107-70cf978996f1/api/checks/update_test.go (about) 1 //go:build small 2 // +build small 3 4 package checks 5 6 import ( 7 "context" 8 "fmt" 9 "net/url" 10 "strings" 11 "testing" 12 13 "github.com/golang/mock/gomock" 14 "github.com/stretchr/testify/assert" 15 "github.com/web-platform-tests/wpt.fyi/api/checks/summaries" 16 "github.com/web-platform-tests/wpt.fyi/shared" 17 "github.com/web-platform-tests/wpt.fyi/shared/sharedtest" 18 ) 19 20 func TestGetDiffSummary_Regressed(t *testing.T) { 21 testSummary := func(enabled bool) { 22 t.Run(fmt.Sprintf("%s=%v", onlyChangesAsRegressionsFeature, enabled), func(t *testing.T) { 23 mockCtrl := gomock.NewController(t) 24 defer mockCtrl.Finish() 25 26 before, after := getBeforeAndAfterRuns() 27 runDiff := shared.RunDiff{ 28 Differences: shared.ResultsDiff{"/foo.html": shared.TestDiff{0, 1, 0}}, 29 } 30 31 aeAPI := sharedtest.NewMockAppEngineAPI(mockCtrl) 32 aeAPI.EXPECT().Context().AnyTimes().Return(context.Background()) 33 aeAPI.EXPECT().IsFeatureEnabled(onlyChangesAsRegressionsFeature).Return(enabled) 34 aeAPI.EXPECT().IsFeatureEnabled(failChecksOnRegressionFeature).Return(false) 35 aeAPI.EXPECT().GetHostname() 36 diffAPI := sharedtest.NewMockDiffAPI(mockCtrl) 37 diffAPI.EXPECT().GetRunsDiff(before, after, sharedtest.SameDiffFilter("ADC"), gomock.Any()).Return(runDiff, nil) 38 if enabled { 39 diffAPI.EXPECT().GetRunsDiff(before, after, sharedtest.SameDiffFilter("C"), gomock.Any()).Return(runDiff, nil) 40 } 41 diffURL, _ := url.Parse("https://wpt.fyi/results?diff") 42 diffAPI.EXPECT().GetDiffURL(before, after, gomock.Any()).Return(diffURL) 43 diffAPI.EXPECT().GetMasterDiffURL(after, sharedtest.SameDiffFilter("ACU")).Return(diffURL) 44 suite := shared.CheckSuite{ 45 PRNumbers: []int{123}, 46 } 47 48 summary, err := getDiffSummary(aeAPI, diffAPI, suite, before, after) 49 assert.Nil(t, err) 50 _, ok := summary.(summaries.Regressed) 51 assert.True(t, ok) 52 assert.Equal(t, suite.PRNumbers, summary.GetCheckState().PRNumbers) 53 }) 54 } 55 testSummary(false) 56 testSummary(true) 57 } 58 59 func TestGetDiffSummary_Completed(t *testing.T) { 60 mockCtrl := gomock.NewController(t) 61 defer mockCtrl.Finish() 62 63 before, after := getBeforeAndAfterRuns() 64 runDiff := shared.RunDiff{ 65 Differences: shared.ResultsDiff{"/foo.html": shared.TestDiff{1, 0, 1}}, 66 } 67 68 aeAPI := sharedtest.NewMockAppEngineAPI(mockCtrl) 69 aeAPI.EXPECT().Context().AnyTimes().Return(context.Background()) 70 aeAPI.EXPECT().IsFeatureEnabled(onlyChangesAsRegressionsFeature).Return(false) 71 aeAPI.EXPECT().IsFeatureEnabled(failChecksOnRegressionFeature).Return(false) 72 aeAPI.EXPECT().GetHostname() 73 diffAPI := sharedtest.NewMockDiffAPI(mockCtrl) 74 diffAPI.EXPECT().GetRunsDiff(before, after, gomock.Any(), gomock.Any()).Return(runDiff, nil) 75 diffURL, _ := url.Parse("https://wpt.fyi/results?diff") 76 diffAPI.EXPECT().GetDiffURL(before, after, gomock.Any()).Return(diffURL) 77 diffAPI.EXPECT().GetMasterDiffURL(after, sharedtest.SameDiffFilter("ACU")).Return(diffURL) 78 suite := shared.CheckSuite{ 79 PRNumbers: []int{123}, 80 } 81 82 summary, err := getDiffSummary(aeAPI, diffAPI, suite, before, after) 83 assert.Nil(t, err) 84 _, ok := summary.(summaries.Completed) 85 assert.True(t, ok) 86 assert.Equal(t, suite.PRNumbers, summary.GetCheckState().PRNumbers) 87 } 88 89 func getBeforeAndAfterRuns() (before, after shared.TestRun) { 90 before.FullRevisionHash = strings.Repeat("0", 40) 91 before.BrowserName = "chrome" 92 before.Labels = []string{shared.PRBaseLabel} 93 after.FullRevisionHash = strings.Repeat("1", 40) 94 after.BrowserName = "chrome" 95 after.Labels = []string{shared.PRHeadLabel} 96 return before, after 97 } 98 99 func TestCollapseSummary_Nesting(t *testing.T) { 100 diff := shared.RunDiff{ 101 BeforeSummary: shared.ResultsSummary{ 102 "/foo/test.html": shared.TestSummary{1, 1}, 103 "/foo/bar/test.html": shared.TestSummary{1, 1}, 104 "/foo/bar/baz/test.html": shared.TestSummary{1, 1}, 105 "/foo/bar/baz/qux/test.html": shared.TestSummary{1, 1}, 106 }, 107 AfterSummary: shared.ResultsSummary{ 108 "/foo/test.html": shared.TestSummary{2, 2}, 109 "/foo/bar/test.html": shared.TestSummary{2, 2}, 110 "/foo/bar/baz/test.html": shared.TestSummary{2, 2}, 111 "/foo/bar/baz/qux/test.html": shared.TestSummary{2, 2}, 112 }, 113 } 114 summary := summaries.BeforeAndAfter{ 115 "/foo/test.html": summaries.TestBeforeAndAfter{PassingBefore: 1, TotalBefore: 1, PassingAfter: 2, TotalAfter: 2}, 116 "/foo/bar/test.html": summaries.TestBeforeAndAfter{PassingBefore: 1, TotalBefore: 1, PassingAfter: 2, TotalAfter: 2}, 117 "/foo/bar/baz/test.html": summaries.TestBeforeAndAfter{PassingBefore: 1, TotalBefore: 1, PassingAfter: 2, TotalAfter: 2}, 118 "/foo/bar/baz/qux/test.html": summaries.TestBeforeAndAfter{PassingBefore: 1, TotalBefore: 1, PassingAfter: 2, TotalAfter: 2}, 119 } 120 assert.Equal(t, summary, collapseSummary(diff, 4)) 121 assert.Equal(t, summaries.BeforeAndAfter{ 122 "/foo/test.html": summaries.TestBeforeAndAfter{PassingBefore: 1, TotalBefore: 1, PassingAfter: 2, TotalAfter: 2}, 123 "/foo/bar/test.html": summaries.TestBeforeAndAfter{PassingBefore: 1, TotalBefore: 1, PassingAfter: 2, TotalAfter: 2}, 124 "/foo/bar/baz/": summaries.TestBeforeAndAfter{PassingBefore: 2, TotalBefore: 2, PassingAfter: 4, TotalAfter: 4}, 125 }, collapseSummary(diff, 3)) 126 assert.Equal(t, summaries.BeforeAndAfter{ 127 "/foo/test.html": summaries.TestBeforeAndAfter{PassingBefore: 1, TotalBefore: 1, PassingAfter: 2, TotalAfter: 2}, 128 "/foo/bar/": summaries.TestBeforeAndAfter{PassingBefore: 3, TotalBefore: 3, PassingAfter: 6, TotalAfter: 6}, 129 }, collapseSummary(diff, 2)) 130 assert.Equal(t, summaries.BeforeAndAfter{ 131 "/foo/": summaries.TestBeforeAndAfter{PassingBefore: 4, TotalBefore: 4, PassingAfter: 8, TotalAfter: 8}, 132 }, collapseSummary(diff, 1)) 133 } 134 135 func TestCollapseSummary_ManyFiles(t *testing.T) { 136 diff := shared.RunDiff{ 137 BeforeSummary: make(shared.ResultsSummary), 138 AfterSummary: make(shared.ResultsSummary), 139 } 140 for i := 1; i <= 20; i++ { 141 diff.BeforeSummary[fmt.Sprintf("/foo/test%v.html", i)] = shared.TestSummary{1, 1} 142 diff.BeforeSummary[fmt.Sprintf("/bar/test%v.html", i)] = shared.TestSummary{1, 1} 143 diff.BeforeSummary[fmt.Sprintf("/baz/test%v.html", i)] = shared.TestSummary{1, 1} 144 diff.AfterSummary[fmt.Sprintf("/foo/test%v.html", i)] = shared.TestSummary{2, 3} 145 diff.AfterSummary[fmt.Sprintf("/bar/test%v.html", i)] = shared.TestSummary{2, 3} 146 diff.AfterSummary[fmt.Sprintf("/baz/test%v.html", i)] = shared.TestSummary{2, 3} 147 } 148 assert.Equal(t, summaries.BeforeAndAfter{ 149 "/foo/": summaries.TestBeforeAndAfter{PassingBefore: 20, TotalBefore: 20, PassingAfter: 40, TotalAfter: 60}, 150 "/bar/": summaries.TestBeforeAndAfter{PassingBefore: 20, TotalBefore: 20, PassingAfter: 40, TotalAfter: 60}, 151 "/baz/": summaries.TestBeforeAndAfter{PassingBefore: 20, TotalBefore: 20, PassingAfter: 40, TotalAfter: 60}, 152 }, collapseSummary(diff, 10)) 153 // A number too small still does its best to collapse. 154 assert.Equal(t, summaries.BeforeAndAfter{ 155 "/foo/": summaries.TestBeforeAndAfter{PassingBefore: 20, TotalBefore: 20, PassingAfter: 40, TotalAfter: 60}, 156 "/bar/": summaries.TestBeforeAndAfter{PassingBefore: 20, TotalBefore: 20, PassingAfter: 40, TotalAfter: 60}, 157 "/baz/": summaries.TestBeforeAndAfter{PassingBefore: 20, TotalBefore: 20, PassingAfter: 40, TotalAfter: 60}, 158 }, collapseSummary(diff, 1)) 159 }