arblant
firefox-vpn-client / core / internal / accounts / store_test.go
store_test.go61 lines · 2.0 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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
package accounts

import (
	"path/filepath"
	"testing"
	"time"

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

// The manager's saves keep the device record that another writer stored
// after the manager loaded its copy; erasing it made every start register
// a new "Firefox's built-in VPN" entry in the account's connected services.
func TestManagerKeepsDeviceRecord(t *testing.T) {
	dir := t.TempDir()
	store, err := OpenStore(dir)
	if err != nil {
		t.Fatal(err)
	}
	acc, _, err := store.Add("a@example.com", &fxa.SavedTokens{AccessToken: "access", RefreshToken: "refresh"}, time.Now())
	if err != nil {
		t.Fatal(err)
	}
	mgr, err := NewManager(store, []string{acc.ID}, Policy{ThresholdPercent: 90}, filepath.Join(dir, "state.json"))
	if err != nil {
		t.Fatal(err)
	}

	stored, _ := store.Get(acc.ID)
	stored.DeviceID, stored.DeviceToken = "dev-1", "fingerprint"
	if err := store.Save(stored); err != nil {
		t.Fatal(err)
	}

	if _, err := mgr.ObserveUsage(acc.ID, Usage{LimitBytes: 100, RemainingBytes: 90}); err != nil {
		t.Fatal(err)
	}
	if err := mgr.MarkUnavailable(acc.ID, Why{Code: ReasonSignInRetry, Text: "test", Detail: "timeout"}, time.Now().Add(time.Minute)); err != nil {
		t.Fatal(err)
	}
	// The reason's code and detail are kept for the apps, next to the text.
	if marked, _ := store.Get(acc.ID); marked.Reason != "test" || marked.ReasonCode != ReasonSignInRetry || marked.ReasonDetail != "timeout" {
		t.Fatalf("reason kept: %+v", marked)
	}
	if err := mgr.Activate(acc.ID); err != nil {
		t.Fatal(err)
	}
	got, err := store.Get(acc.ID)
	if err != nil {
		t.Fatal(err)
	}
	if got.DeviceID != "dev-1" || got.DeviceToken != "fingerprint" {
		t.Fatalf("device record lost: %+v", got)
	}
	if got.Reason != "" || got.ReasonCode != "" || got.ReasonDetail != "" {
		t.Fatalf("a usable account has no reason: %+v", got)
	}
	if got.Usage == nil || got.Usage.RemainingBytes != 90 || got.Status != StatusReady {
		t.Fatalf("manager fields not saved: %+v", got)
	}
}