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  }