From f0c63b6ccdbfe35c5e4f42554840608fc2142a3e Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Tue, 24 Jun 2025 09:40:31 +0100 Subject: [PATCH] Merge pull request #26175 from overleaf/bg-fix-logging-in-project-deletion test logging in user and project deletion GitOrigin-RevId: ea51082aeada81f8e7ae356966cda0f57f7cd072 --- .../src/Features/Project/ProjectDeleter.js | 2 +- .../web/test/acceptance/src/DeletionTests.mjs | 36 +++++++++++++++++++ .../unit/src/Project/ProjectDeleterTests.js | 11 ++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/services/web/app/src/Features/Project/ProjectDeleter.js b/services/web/app/src/Features/Project/ProjectDeleter.js index b81281e319..b4f6a2b779 100644 --- a/services/web/app/src/Features/Project/ProjectDeleter.js +++ b/services/web/app/src/Features/Project/ProjectDeleter.js @@ -385,7 +385,7 @@ async function expireDeletedProject(projectId) { ) return } - const userId = deletedProject.deletedProjectOwnerId + const userId = deletedProject.deleterData?.deletedProjectOwnerId?.toString() const historyId = deletedProject.project.overleaf && deletedProject.project.overleaf.history && diff --git a/services/web/test/acceptance/src/DeletionTests.mjs b/services/web/test/acceptance/src/DeletionTests.mjs index 121c2580d8..e589be9474 100644 --- a/services/web/test/acceptance/src/DeletionTests.mjs +++ b/services/web/test/acceptance/src/DeletionTests.mjs @@ -1,3 +1,5 @@ +import logger from '@overleaf/logger' +import sinon from 'sinon' import User from './helpers/User.mjs' import Subscription from './helpers/Subscription.mjs' import request from './helpers/request.js' @@ -18,6 +20,8 @@ let MockDocstoreApi, MockGitBridgeApi, MockHistoryBackupDeletionApi +let spy + before(function () { MockDocstoreApi = MockDocstoreApiClass.instance() MockFilestoreApi = MockFilestoreApiClass.instance() @@ -28,6 +32,7 @@ before(function () { describe('Deleting a user', function () { beforeEach(function (done) { + spy = sinon.spy(logger, 'info') async.auto( { user: cb => { @@ -64,6 +69,10 @@ describe('Deleting a user', function () { ) }) + afterEach(function () { + spy.restore() + }) + it('Should remove the user from active users', function (done) { this.user.get((error, user) => { expect(error).not.to.exist @@ -183,6 +192,7 @@ describe('Deleting a user', function () { describe('Deleting a project', function () { beforeEach(function (done) { + spy = sinon.spy(logger, 'info') this.user = new User() this.projectName = 'wombat' this.user.ensureUserExists(() => { @@ -195,6 +205,10 @@ describe('Deleting a project', function () { }) }) + afterEach(function () { + logger.info.restore() + }) + it('Should remove the project from active projects', function (done) { this.user.getProject(this.projectId, (error, project) => { expect(error).not.to.exist @@ -292,6 +306,28 @@ describe('Deleting a project', function () { }) }) + it('Should log a successful deletion', function (done) { + request.post( + `/internal/project/${this.projectId}/expire-deleted-project`, + { + auth: { + user: settings.apis.web.user, + pass: settings.apis.web.pass, + sendImmediately: true, + }, + }, + (error, res) => { + expect(error).not.to.exist + expect(res.statusCode).to.equal(200) + expect(spy).to.have.been.calledWithMatch( + { projectId: this.projectId, userId: this.user._id }, + 'expired deleted project successfully' + ) + done() + } + ) + }) + it('Should destroy the docs', function (done) { expect( MockDocstoreApi.docs[this.projectId.toString()][this.docId.toString()] diff --git a/services/web/test/unit/src/Project/ProjectDeleterTests.js b/services/web/test/unit/src/Project/ProjectDeleterTests.js index 20f8cf2ead..199b8518e7 100644 --- a/services/web/test/unit/src/Project/ProjectDeleterTests.js +++ b/services/web/test/unit/src/Project/ProjectDeleterTests.js @@ -36,6 +36,7 @@ describe('ProjectDeleter', function () { deleterId: '588f3ddae8ebc1bac07c9fa4', deleterIpAddress: '172.19.0.1', deletedProjectId: '5cf9270b4eff6e186cf8b05e', + deletedProjectOwnerId: this.user._id, }, project: { _id: '5cf9270b4eff6e186cf8b05e', @@ -501,6 +502,16 @@ describe('ProjectDeleter', function () { projectId: this.deletedProjects[0].project._id, }) }) + + it('should log a completed deletion', async function () { + expect(this.logger.info).to.have.been.calledWith( + { + projectId: this.deletedProjects[0].project._id, + userId: this.user._id, + }, + 'expired deleted project successfully' + ) + }) }) describe('on an active project (from an incomplete delete)', function () {