()
| 626 | } |
| 627 | |
| 628 | func (ts *AdminTestSuite) TestAdminUserSoftDeletion() { |
| 629 | // create user |
| 630 | u, err := models.NewUser("123456789", "test@example.com", "secret", ts.Config.JWT.Aud, map[string]interface{}{"name": "test"}) |
| 631 | require.NoError(ts.T(), err) |
| 632 | u.ConfirmationToken = "some_token" |
| 633 | u.RecoveryToken = "some_token" |
| 634 | u.EmailChangeTokenCurrent = "some_token" |
| 635 | u.EmailChangeTokenNew = "some_token" |
| 636 | u.PhoneChangeToken = "some_token" |
| 637 | u.AppMetaData = map[string]interface{}{ |
| 638 | "provider": "email", |
| 639 | } |
| 640 | require.NoError(ts.T(), ts.API.db.Create(u)) |
| 641 | require.NoError(ts.T(), models.CreateOneTimeToken(ts.API.db, u.ID, u.GetEmail(), u.ConfirmationToken, models.ConfirmationToken)) |
| 642 | require.NoError(ts.T(), models.CreateOneTimeToken(ts.API.db, u.ID, u.GetEmail(), u.RecoveryToken, models.RecoveryToken)) |
| 643 | require.NoError(ts.T(), models.CreateOneTimeToken(ts.API.db, u.ID, u.GetEmail(), u.EmailChangeTokenCurrent, models.EmailChangeTokenCurrent)) |
| 644 | require.NoError(ts.T(), models.CreateOneTimeToken(ts.API.db, u.ID, u.GetEmail(), u.EmailChangeTokenNew, models.EmailChangeTokenNew)) |
| 645 | require.NoError(ts.T(), models.CreateOneTimeToken(ts.API.db, u.ID, u.GetPhone(), u.PhoneChangeToken, models.PhoneChangeToken)) |
| 646 | |
| 647 | // create user identities |
| 648 | _, err = ts.API.createNewIdentity(ts.API.db, u, "email", map[string]interface{}{ |
| 649 | "sub": "123456", |
| 650 | "email": "test@example.com", |
| 651 | }) |
| 652 | require.NoError(ts.T(), err) |
| 653 | _, err = ts.API.createNewIdentity(ts.API.db, u, "github", map[string]interface{}{ |
| 654 | "sub": "234567", |
| 655 | "email": "test@example.com", |
| 656 | }) |
| 657 | require.NoError(ts.T(), err) |
| 658 | |
| 659 | // register a WebAuthn credential for the user |
| 660 | passkey := &models.WebAuthnCredential{ |
| 661 | ID: uuid.Must(uuid.NewV4()), |
| 662 | UserID: u.ID, |
| 663 | CredentialID: []byte("test-credential-id"), |
| 664 | PublicKey: []byte("test-public-key"), |
| 665 | FriendlyName: "test passkey", |
| 666 | } |
| 667 | require.NoError(ts.T(), ts.API.db.Create(passkey)) |
| 668 | |
| 669 | var buffer bytes.Buffer |
| 670 | require.NoError(ts.T(), json.NewEncoder(&buffer).Encode(map[string]interface{}{ |
| 671 | "should_soft_delete": true, |
| 672 | })) |
| 673 | w := httptest.NewRecorder() |
| 674 | req := httptest.NewRequest(http.MethodDelete, fmt.Sprintf("/admin/users/%s", u.ID), &buffer) |
| 675 | |
| 676 | req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", ts.token)) |
| 677 | |
| 678 | ts.API.handler.ServeHTTP(w, req) |
| 679 | require.Equal(ts.T(), http.StatusOK, w.Code) |
| 680 | |
| 681 | // get soft-deleted user from db |
| 682 | deletedUser, err := models.FindUserByID(ts.API.db, u.ID) |
| 683 | require.NoError(ts.T(), err) |
| 684 | |
| 685 | require.Empty(ts.T(), deletedUser.ConfirmationToken) |
nothing calls this directly
no test coverage detected