arblant
firefox-vpn-client / core / internal / serverlist / version_test.go
version_test.go42 lines · 1.4 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
package serverlist

import (
	"context"
	"io"
	"net/http"
	"strings"
	"testing"

	"github.com/armanlife/firefox-vpn-client/core/internal/controlplane"
)

type versionRoundTripper func(*http.Request) (*http.Response, error)

func (f versionRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) { return f(r) }

func serveVersions(t *testing.T, status int, body string) {
	t.Helper()
	previous := controlplane.Transport()
	t.Cleanup(func() { controlplane.SetTransport(previous) })
	controlplane.SetTransport(versionRoundTripper(func(r *http.Request) (*http.Response, error) {
		if r.URL.String() != productDetailsURL {
			t.Errorf("unexpected request %s", r.URL)
		}
		return &http.Response{StatusCode: status, Header: make(http.Header), Body: io.NopCloser(strings.NewReader(body)), Request: r}, nil
	}))
}

func TestLatestFirefoxVersionPrefersNightly(t *testing.T) {
	serveVersions(t, 200, `{"FIREFOX_NIGHTLY":"161.0a1","LATEST_FIREFOX_VERSION":"158.0"}`)
	if v, err := LatestFirefoxVersion(context.Background()); err != nil || v != "161.0a1" {
		t.Fatalf("got %q %v", v, err)
	}
	serveVersions(t, 200, `{"FIREFOX_NIGHTLY":"","LATEST_FIREFOX_VERSION":"158.0.1"}`)
	if v, err := LatestFirefoxVersion(context.Background()); err != nil || v != "158.0.1" {
		t.Fatalf("release fallback: %q %v", v, err)
	}
	serveVersions(t, 503, `busy`)
	if _, err := LatestFirefoxVersion(context.Background()); err == nil {
		t.Fatal("an HTTP error must fail")
	}
}