test: stabilize webhook synchronization and local cookie navigation (#1671)

This commit is contained in:
Levi authored and GitHub committed 2026-11-14 11:48:16 +08:00
1 parent 506f689992
commit be0a395447
3 files changed
+33 -23

No files matched your search

+5 -8
View File
@@ -25,7 +25,6 @@ const defaultAvailabilityTimeout = time.Minute
type ContractOptions struct { type ContractOptions struct {
AvailabilityTimeout time.Duration AvailabilityTimeout time.Duration
CookieDomainMode CookieDomainMode CookieDomainMode CookieDomainMode
CookieTestURL string
} }
type CookieDomainMode int type CookieDomainMode int
@@ -44,7 +43,7 @@ func RunProviderContract(t *testing.T, provider enginewebview.Provider, opts Con
} }
waitForProviderAvailable(t, provider, timeout) waitForProviderAvailable(t, provider, timeout)
page, server, testURL := openTestPage(t, provider, enginewebview.OpenOptions{ page, _, testURL := openTestPage(t, provider, enginewebview.OpenOptions{
Headless: true, Headless: true,
Title: "Gopeed WebView Integration", Title: "Gopeed WebView Integration",
Width: 640, Width: 640,
@@ -155,11 +154,9 @@ func RunProviderContract(t *testing.T, provider enginewebview.Provider, opts Con
t.Fatal("expected missing selector wait to time out") t.Fatal("expected missing selector wait to time out")
} }
cookieTestURL := opts.CookieTestURL // Keep cookie navigation on the same local fixture as the DOM assertions:
if cookieTestURL == "" { // this contract must not depend on public DNS, TLS, or site availability.
cookieTestURL = testURL runCookieLifecycleAssertions(t, page, testURL, opts.CookieDomainMode)
}
runCookieLifecycleAssertions(t, page, server, cookieTestURL, opts.CookieDomainMode)
} }
func waitForProviderAvailable(t *testing.T, provider enginewebview.Provider, timeout time.Duration) { func waitForProviderAvailable(t *testing.T, provider enginewebview.Provider, timeout time.Duration) {
@@ -270,7 +267,7 @@ func openTestPage(t *testing.T, provider enginewebview.Provider, opts enginewebv
return page, server, server.URL return page, server, server.URL
} }
func runCookieLifecycleAssertions(t *testing.T, page *enginewebview.PageHandle, _ *httptest.Server, testURL string, domainMode CookieDomainMode) { func runCookieLifecycleAssertions(t *testing.T, page *enginewebview.PageHandle, testURL string, domainMode CookieDomainMode) {
t.Helper() t.Helper()
parsedURL, err := url.Parse(testURL) parsedURL, err := url.Parse(testURL)
@@ -26,7 +26,6 @@ func TestProviderContract(t *testing.T) {
}) })
integrationtest.RunProviderContract(t, provider, integrationtest.ContractOptions{ integrationtest.RunProviderContract(t, provider, integrationtest.ContractOptions{
CookieDomainMode: integrationtest.CookieDomainModeRequired, CookieDomainMode: integrationtest.CookieDomainModeRequired,
CookieTestURL: "https://example.com/",
}) })
} }
+28 -14
View File
@@ -190,14 +190,14 @@ func TestWebhook_NoWebhookConfigured(t *testing.T) {
} }
func TestWebhook_MultipleUrls(t *testing.T) { func TestWebhook_MultipleUrls(t *testing.T) {
count := 0 received := make(chan string, 2)
server1 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { server1 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
count++ received <- "server1"
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
})) }))
defer server1.Close() defer server1.Close()
server2 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { server2 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
count++ received <- "server2"
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
})) }))
defer server2.Close() defer server2.Close()
@@ -219,11 +219,21 @@ func TestWebhook_MultipleUrls(t *testing.T) {
// Trigger webhook // Trigger webhook
downloader.triggerWebhooks(WebhookEventDownloadDone, task, nil) downloader.triggerWebhooks(WebhookEventDownloadDone, task, nil)
// Wait for webhooks // Wait for each destination, rather than racing on a shared counter or
time.Sleep(500 * time.Millisecond) // assuming that both requests finish within a fixed sleep.
timer := time.NewTimer(2 * time.Second)
if count != 2 { defer timer.Stop()
t.Errorf("Expected 2 webhook calls, got %d", count) seen := make(map[string]bool)
for len(seen) < 2 {
select {
case server := <-received:
if seen[server] {
t.Fatalf("Duplicate webhook call to %s", server)
}
seen[server] = true
case <-timer.C:
t.Fatalf("Timeout waiting for both webhook destinations; received: %v", seen)
}
} }
}) })
} }
@@ -629,9 +639,9 @@ func TestWebhook_SendWebhookToUrl_VariousStatusCodes(t *testing.T) {
} }
func TestWebhook_TriggerWebhooks_EmptyUrlSkipped(t *testing.T) { func TestWebhook_TriggerWebhooks_EmptyUrlSkipped(t *testing.T) {
requestCount := 0 received := make(chan struct{}, 2)
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
requestCount++ received <- struct{}{}
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
})) }))
defer server.Close() defer server.Close()
@@ -650,10 +660,14 @@ func TestWebhook_TriggerWebhooks_EmptyUrlSkipped(t *testing.T) {
downloader.triggerWebhooks(WebhookEventDownloadDone, task, nil) downloader.triggerWebhooks(WebhookEventDownloadDone, task, nil)
time.Sleep(500 * time.Millisecond) timer := time.NewTimer(2 * time.Second)
defer timer.Stop()
if requestCount != 2 { for count := 0; count < 2; count++ {
t.Errorf("Expected 2 requests (empty URL should be skipped), got %d", requestCount) select {
case <-received:
case <-timer.C:
t.Fatalf("Expected 2 requests (empty URL should be skipped), got %d", count)
}
} }
}) })
} }