@@ -13,6 +13,7 @@ import (
1313
1414 "github.com/google/go-cmp/cmp"
1515 "github.com/google/go-cmp/cmp/cmpopts"
16+ "github.com/zalando/go-keyring"
1617)
1718
1819const testOwner = "octocat"
@@ -556,6 +557,80 @@ func TestTokenResolution(t *testing.T) {
556557 t .Fatalf ("got %q, %v" , tok , err )
557558 }
558559 })
560+
561+ t .Run ("required missing" , func (t * testing.T ) {
562+ src := RequireToken (StaticTokenSource ("" ))
563+ tok , err := src .Token (context .Background ())
564+ if ! errors .Is (err , ErrRequiredToken ) || errors .Is (err , ErrNoToken ) || tok != "" {
565+ t .Fatalf ("got %q, %v" , tok , err )
566+ }
567+ })
568+
569+ t .Run ("required present" , func (t * testing.T ) {
570+ src := RequireToken (StaticTokenSource ("required-token" ))
571+ tok , err := src .Token (context .Background ())
572+ if err != nil || tok != "required-token" {
573+ t .Fatalf ("got %q, %v" , tok , err )
574+ }
575+ })
576+
577+ t .Run ("keyring" , func (t * testing.T ) {
578+ var service , account string
579+ src := & keyringTokenSource {
580+ account : "github.com" ,
581+ get : func (gotService , gotAccount string ) (string , error ) {
582+ service , account = gotService , gotAccount
583+ return " keyring-token\n " , nil
584+ },
585+ }
586+ tok , err := src .Token (context .Background ())
587+ if err != nil || tok != "keyring-token" {
588+ t .Fatalf ("got %q, %v" , tok , err )
589+ }
590+ if service != KeyringService || account != "github.com" {
591+ t .Fatalf ("lookup = %q/%q, want %q/github.com" , service , account , KeyringService )
592+ }
593+ })
594+
595+ t .Run ("keyring missing" , func (t * testing.T ) {
596+ src := & keyringTokenSource {
597+ account : "missing" ,
598+ get : func (string , string ) (string , error ) { return "" , keyring .ErrNotFound },
599+ }
600+ tok , err := src .Token (context .Background ())
601+ if ! errors .Is (err , ErrNoToken ) || tok != "" {
602+ t .Fatalf ("got %q, %v" , tok , err )
603+ }
604+ })
605+
606+ t .Run ("keyring backend failure" , func (t * testing.T ) {
607+ backendErr := errors .New ("backend unavailable" )
608+ src := & keyringTokenSource {
609+ account : "github.com" ,
610+ get : func (string , string ) (string , error ) { return "" , backendErr },
611+ }
612+ _ , err := src .Token (context .Background ())
613+ if ! errors .Is (err , backendErr ) || ! strings .Contains (err .Error (), "keyring" ) {
614+ t .Fatalf ("got %v, want wrapped keyring backend error" , err )
615+ }
616+ })
617+
618+ t .Run ("keyring canceled" , func (t * testing.T ) {
619+ ctx , cancel := context .WithCancel (context .Background ())
620+ cancel ()
621+ called := false
622+ src := & keyringTokenSource {
623+ account : "github.com" ,
624+ get : func (string , string ) (string , error ) {
625+ called = true
626+ return "token" , nil
627+ },
628+ }
629+ _ , err := src .Token (ctx )
630+ if ! errors .Is (err , context .Canceled ) || called {
631+ t .Fatalf ("got err=%v called=%t, want canceled without lookup" , err , called )
632+ }
633+ })
559634}
560635
561636type fakeRunner struct {
0 commit comments