From bef3ccf4521d4ed431f3cdfc66e618c619ce28e4 Mon Sep 17 00:00:00 2001 From: "Simen A. W. Olsen" Date: Tue, 3 Nov 2026 22:08:49 +0100 Subject: Share one Fiken login between programs fikenconfig keeps an OAuth app and a grant per account in ~/.config/fiken, and finds the account that reaches a company. Renewing a grant takes a lock, so programs sharing it take turns. --- fikenauth/source_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'fikenauth/source_test.go') diff --git a/fikenauth/source_test.go b/fikenauth/source_test.go index 1c960d6..24147e0 100644 --- a/fikenauth/source_test.go +++ b/fikenauth/source_test.go @@ -170,3 +170,34 @@ func TestLogoutWithoutATokenIsNoToken(t *testing.T) { t.Errorf("err = %v, want ErrNoToken", err) } } + +// Two programs sharing one grant: the second to find it expired must use what +// the first saved, because refresh-1 died when the first one renewed it. +func TestSourceRereadsAGrantAnotherProgramRenewed(t *testing.T) { + server := newAuthServer(t) + server.refreshOut = `{"access_token":"access-2","refresh_token":"refresh-2","expires_in":3600}` + store := tempStore(t) + if err := store.Save(Token{ + AccessToken: "expired", RefreshToken: "refresh-1", + ExpiresAt: fixedNow.Add(-time.Hour), + }); err != nil { + t.Fatal(err) + } + + late := NewSource(server.config(), NewStore(store.Path())) + if _, err := late.Current(); err != nil { + t.Fatal(err) + } + if _, err := NewSource(server.config(), store).Token(t.Context()); err != nil { + t.Fatalf("first program: %v", err) + } + + server.gotForm = nil + got, err := late.Token(t.Context()) + if err != nil { + t.Fatalf("second program: %v", err) + } + if got != "access-2" || server.gotForm != nil { + t.Errorf("Token = %q, refreshed again: %v; want the first program's grant", got, server.gotForm != nil) + } +} -- cgit v1.3.1