(t *testing.T)
| 148 | } |
| 149 | |
| 150 | func TestLoginToken(t *testing.T) { |
| 151 | ctx := context.Background() |
| 152 | |
| 153 | t.Run("tokenLoginFlow", func(t *testing.T) { |
| 154 | test.WithAllDatabases(t, func(t *testing.T, dbType test.DBType) { |
| 155 | userAPI, accountDB, close := MustMakeInternalAPI(t, apiTestOpts{}, dbType) |
| 156 | defer close() |
| 157 | _, err := accountDB.CreateAccount(ctx, "auser", "apassword", "", api.AccountTypeUser) |
| 158 | if err != nil { |
| 159 | t.Fatalf("failed to make account: %s", err) |
| 160 | } |
| 161 | |
| 162 | t.Log("Creating a login token like the SSO callback would...") |
| 163 | |
| 164 | creq := api.PerformLoginTokenCreationRequest{ |
| 165 | Data: api.LoginTokenData{UserID: "@auser:example.com"}, |
| 166 | } |
| 167 | var cresp api.PerformLoginTokenCreationResponse |
| 168 | if err := userAPI.PerformLoginTokenCreation(ctx, &creq, &cresp); err != nil { |
| 169 | t.Fatalf("PerformLoginTokenCreation failed: %v", err) |
| 170 | } |
| 171 | |
| 172 | if cresp.Metadata.Token == "" { |
| 173 | t.Errorf("PerformLoginTokenCreation Token: got %q, want non-empty", cresp.Metadata.Token) |
| 174 | } |
| 175 | if cresp.Metadata.Expiration.Before(time.Now()) { |
| 176 | t.Errorf("PerformLoginTokenCreation Expiration: got %v, want non-expired", cresp.Metadata.Expiration) |
| 177 | } |
| 178 | |
| 179 | t.Log("Querying the login token like /login with m.login.token would...") |
| 180 | |
| 181 | qreq := api.QueryLoginTokenRequest{Token: cresp.Metadata.Token} |
| 182 | var qresp api.QueryLoginTokenResponse |
| 183 | if err := userAPI.QueryLoginToken(ctx, &qreq, &qresp); err != nil { |
| 184 | t.Fatalf("QueryLoginToken failed: %v", err) |
| 185 | } |
| 186 | |
| 187 | if qresp.Data == nil { |
| 188 | t.Errorf("QueryLoginToken Data: got %v, want non-nil", qresp.Data) |
| 189 | } else if want := "@auser:example.com"; qresp.Data.UserID != want { |
| 190 | t.Errorf("QueryLoginToken UserID: got %q, want %q", qresp.Data.UserID, want) |
| 191 | } |
| 192 | |
| 193 | t.Log("Deleting the login token like /login with m.login.token would...") |
| 194 | |
| 195 | dreq := api.PerformLoginTokenDeletionRequest{Token: cresp.Metadata.Token} |
| 196 | var dresp api.PerformLoginTokenDeletionResponse |
| 197 | if err := userAPI.PerformLoginTokenDeletion(ctx, &dreq, &dresp); err != nil { |
| 198 | t.Fatalf("PerformLoginTokenDeletion failed: %v", err) |
| 199 | } |
| 200 | }) |
| 201 | }) |
| 202 | |
| 203 | t.Run("expiredTokenIsNotReturned", func(t *testing.T) { |
| 204 | test.WithAllDatabases(t, func(t *testing.T, dbType test.DBType) { |
| 205 | userAPI, _, close := MustMakeInternalAPI(t, apiTestOpts{loginTokenLifetime: -1 * time.Second}, dbType) |
| 206 | defer close() |
| 207 |
nothing calls this directly
no test coverage detected