(t *testing.T)
| 165 | } |
| 166 | |
| 167 | func TestResetMismatchedOIDCLinks(t *testing.T) { |
| 168 | t.Parallel() |
| 169 | |
| 170 | t.Run("ResetsOnlyMismatched", func(t *testing.T) { |
| 171 | t.Parallel() |
| 172 | ctx := testutil.Context(t, testutil.WaitShort) |
| 173 | |
| 174 | db, _ := dbtestutil.NewDB(t) |
| 175 | const expectedIssuer = "https://accounts.google.com" |
| 176 | |
| 177 | // Correctly linked user. |
| 178 | correctUser := dbgen.User(t, db, database.User{LoginType: database.LoginTypeOIDC}) |
| 179 | correctLink := dbgen.UserLink(t, db, database.UserLink{ |
| 180 | UserID: correctUser.ID, |
| 181 | LoginType: database.LoginTypeOIDC, |
| 182 | LinkedID: expectedIssuer + "||sub-correct", |
| 183 | }) |
| 184 | |
| 185 | // Mismatched user. |
| 186 | mismatchedUser := dbgen.User(t, db, database.User{LoginType: database.LoginTypeOIDC}) |
| 187 | dbgen.UserLink(t, db, database.UserLink{ |
| 188 | UserID: mismatchedUser.ID, |
| 189 | LoginType: database.LoginTypeOIDC, |
| 190 | LinkedID: "https://old-issuer.example.com||sub-mismatched", |
| 191 | }) |
| 192 | |
| 193 | // Unlinked user (empty linked_id). |
| 194 | unlinkedUser := dbgen.User(t, db, database.User{LoginType: database.LoginTypeOIDC}) |
| 195 | dbgen.UserLink(t, db, database.UserLink{ |
| 196 | UserID: unlinkedUser.ID, |
| 197 | LoginType: database.LoginTypeOIDC, |
| 198 | LinkedID: "", |
| 199 | }) |
| 200 | |
| 201 | count, err := authlink.ResetMismatchedOIDCLinks(ctx, db, expectedIssuer) |
| 202 | require.NoError(t, err) |
| 203 | require.EqualValues(t, 1, count) |
| 204 | |
| 205 | // Verify the correct link is unchanged. |
| 206 | link, err := db.GetUserLinkByUserIDLoginType(ctx, database.GetUserLinkByUserIDLoginTypeParams{ |
| 207 | UserID: correctUser.ID, |
| 208 | LoginType: database.LoginTypeOIDC, |
| 209 | }) |
| 210 | require.NoError(t, err) |
| 211 | require.Equal(t, correctLink.LinkedID, link.LinkedID) |
| 212 | |
| 213 | // Verify the mismatched link was reset. |
| 214 | link, err = db.GetUserLinkByUserIDLoginType(ctx, database.GetUserLinkByUserIDLoginTypeParams{ |
| 215 | UserID: mismatchedUser.ID, |
| 216 | LoginType: database.LoginTypeOIDC, |
| 217 | }) |
| 218 | require.NoError(t, err) |
| 219 | require.Equal(t, "", link.LinkedID) |
| 220 | |
| 221 | // Verify the unlinked user is still unlinked. |
| 222 | link, err = db.GetUserLinkByUserIDLoginType(ctx, database.GetUserLinkByUserIDLoginTypeParams{ |
| 223 | UserID: unlinkedUser.ID, |
| 224 | LoginType: database.LoginTypeOIDC, |
nothing calls this directly
no test coverage detected