mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-15 12:53:41 +00:00
test: stabilize webhook synchronization and local cookie navigation (#1671)
This commit is contained in:
3 files changed
+33
-23
No files matched your search
@@ -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/",
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user