From 436e5357000bb78b7675c53aefe4868cc84d0c83 Mon Sep 17 00:00:00 2001 From: Oleg Valiulin Date: Wed, 15 Jan 2025 19:49:17 +0000 Subject: [PATCH 01/11] test to confirm coorect deletion after fix #8872 --- .../issues_prs2/issue_8872_delete_frame.js | 71 +++++++++++++++++++ tests/cypress/support/utils_e2e.js | 15 ++++ 2 files changed, 86 insertions(+) create mode 100644 tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js create mode 100644 tests/cypress/support/utils_e2e.js diff --git a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js new file mode 100644 index 00000000000..60ce1268681 --- /dev/null +++ b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js @@ -0,0 +1,71 @@ +// Copyright (C) 2025 CVAT.ai Corporation +// +// SPDX-License-Identifier: MIT + +/// + +import { taskName } from '../../support/const'; +import { clickDeleteFrame, clickSave } from '../../support/utils_e2e'; + +context('UI and job metadata work correctly when deleting frames', () => { + const chunkReloadPeriod = 100; // 100 ms + let defaultJobMetadataReloadPreiod; + let frameNum; + + before(() => { + cy.openTaskJob(taskName); + cy.window().then((window) => { + defaultJobMetadataReloadPreiod = window.cvat.config.jobMetaDataReloadPeriod; + window.cvat.config.jobMetaDataReloadPeriod = chunkReloadPeriod; + }); + }); + + function getCurrentFrameNum() { + cy.get('.cvat-player-frame-selector').within(() => { + cy.get('[role="spinbutton"]') + .should('have.attr', 'aria-valuenow') + .then((valueFrameNow) => { + frameNum = Number(valueFrameNow); + }); + }); + } + + describe('Attempt to delete any frame after repeated request to /data/meta/', () => { + it('Elapse job metadata reload period, delete a frame, validate UI state is and request body ', () => { + cy.intercept('GET', '/api/jobs/**/data/meta**').as('getMeta'); + cy.intercept('PATCH', '/api/jobs/**/data/meta**').as('patchMeta'); + + cy.goToNextFrame(1); + cy.wait('@getMeta').then((interceptor) => { + expect(interceptor.response.body).to.haveOwnProperty('frames'); + getCurrentFrameNum(); + }); + + // Delete frame, ignore new request + clickDeleteFrame(); + cy.get('.cvat-player-restore-frame').should('not.exist'); // ???: not sure about this one, it might be visible + + // Save and intercept request to confirm validate deleted frames + clickSave(); + cy.wait('@patchMeta').then((interceptor) => { + expect(interceptor.response.body).to.haveOwnProperty('deleted_frames'); + const deletedFrames = interceptor.response.body.deleted_frames; + assert(Array.isArray(deletedFrames) && deletedFrames.length === 1); + + // Check old frame is unavailable + cy.checkFrameNum(frameNum + 1); + + // Check deleted frames are correct + const [actualDeletedFrames, expectedDeletedFrames] = [deletedFrames[0], frameNum]; + expect(actualDeletedFrames).to.equal(expectedDeletedFrames); + // Will this be enough? + }); + }); + + after(() => { + cy.window().then((window) => { + window.cvat.config.jobMetaDataReloadPeriod = defaultJobMetadataReloadPreiod; + }); + }); + }); +}); diff --git a/tests/cypress/support/utils_e2e.js b/tests/cypress/support/utils_e2e.js new file mode 100644 index 00000000000..de092fa338d --- /dev/null +++ b/tests/cypress/support/utils_e2e.js @@ -0,0 +1,15 @@ +// Copyright (C) 2025 CVAT.ai Corporation +// +// SPDX-License-Identifier: MIT + +export function clickDeleteFrame() { + cy.get('.cvat-player-delete-frame').click(); + cy.get('.cvat-modal-delete-frame').within(() => { + cy.contains('button', 'Delete').click(); + }); +} + +export function clickSave() { + cy.get('button').contains('Save').click({ force: true }); + cy.get('button').contains('Save').trigger('mouseout'); +} From 041b822a5e8b39fb0bbb8eca31ecc882a3069426 Mon Sep 17 00:00:00 2001 From: Oleg Valiulin Date: Fri, 17 Jan 2025 19:54:58 +0000 Subject: [PATCH 02/11] refactor get current frame logic to use alias --- .../issues_prs2/issue_8872_delete_frame.js | 35 ++++++++----------- tests/cypress/support/commands.js | 10 ++++++ 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js index 60ce1268681..f31af300c3e 100644 --- a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js +++ b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js @@ -10,7 +10,6 @@ import { clickDeleteFrame, clickSave } from '../../support/utils_e2e'; context('UI and job metadata work correctly when deleting frames', () => { const chunkReloadPeriod = 100; // 100 ms let defaultJobMetadataReloadPreiod; - let frameNum; before(() => { cy.openTaskJob(taskName); @@ -20,25 +19,18 @@ context('UI and job metadata work correctly when deleting frames', () => { }); }); - function getCurrentFrameNum() { - cy.get('.cvat-player-frame-selector').within(() => { - cy.get('[role="spinbutton"]') - .should('have.attr', 'aria-valuenow') - .then((valueFrameNow) => { - frameNum = Number(valueFrameNow); - }); - }); - } - describe('Attempt to delete any frame after repeated request to /data/meta/', () => { it('Elapse job metadata reload period, delete a frame, validate UI state is and request body ', () => { cy.intercept('GET', '/api/jobs/**/data/meta**').as('getMeta'); cy.intercept('PATCH', '/api/jobs/**/data/meta**').as('patchMeta'); + const frameAlias = 'oldCurrentFrame'; cy.goToNextFrame(1); cy.wait('@getMeta').then((interceptor) => { expect(interceptor.response.body).to.haveOwnProperty('frames'); - getCurrentFrameNum(); + // enqueue current frame number + // save it in context + cy.getCurrentFrameNumber(frameAlias); }); // Delete frame, ignore new request @@ -48,17 +40,18 @@ context('UI and job metadata work correctly when deleting frames', () => { // Save and intercept request to confirm validate deleted frames clickSave(); cy.wait('@patchMeta').then((interceptor) => { - expect(interceptor.response.body).to.haveOwnProperty('deleted_frames'); - const deletedFrames = interceptor.response.body.deleted_frames; - assert(Array.isArray(deletedFrames) && deletedFrames.length === 1); + cy.get(`@${frameAlias}`).then((frameNum) => { + expect(interceptor.response.body).to.haveOwnProperty('deleted_frames'); + const deletedFrames = interceptor.response.body.deleted_frames; + assert(Array.isArray(deletedFrames) && deletedFrames.length === 1); - // Check old frame is unavailable - cy.checkFrameNum(frameNum + 1); + // Check old frame is unavailable + cy.checkFrameNum(frameNum + 1); - // Check deleted frames are correct - const [actualDeletedFrames, expectedDeletedFrames] = [deletedFrames[0], frameNum]; - expect(actualDeletedFrames).to.equal(expectedDeletedFrames); - // Will this be enough? + // Check deleted frames are correct + const [actualDeletedFrames, expectedDeletedFrames] = [deletedFrames[0], frameNum]; + expect(actualDeletedFrames).to.equal(expectedDeletedFrames); + }); }); }); diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index a027c260e7b..30fa35dd93b 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -1704,3 +1704,13 @@ Cypress.Commands.overwrite('reload', (orig, options) => { orig(options); cy.closeModalUnsupportedPlatform(); }); + +Cypress.Commands.add('getCurrentFrameNumber', (alias) => { + cy.get('.cvat-player-frame-selector').within(() => { + cy.get('[role="spinbutton"]') + .should('have.attr', 'aria-valuenow') + .then((valueFrameNow) => { + cy.wrap(Number(valueFrameNow)).as(alias); + }); + }); +}); From 78954166179804a9f9dc24fa5bf6f6420d6f3bea Mon Sep 17 00:00:00 2001 From: Oleg Valiulin Date: Fri, 17 Jan 2025 21:01:27 +0000 Subject: [PATCH 03/11] add commands for clicking save and delete frame buttons --- .../issues_prs2/issue_8785_update_job_metadata.js | 15 ++------------- .../e2e/issues_prs2/issue_8872_delete_frame.js | 5 ++--- tests/cypress/support/commands.js | 12 ++++++++++++ tests/cypress/support/utils_e2e.js | 12 ------------ 4 files changed, 16 insertions(+), 28 deletions(-) diff --git a/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js b/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js index f34d3417c57..e8b62854e75 100644 --- a/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js +++ b/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js @@ -9,17 +9,6 @@ import { taskName } from '../../support/const'; context('The UI remains stable even when the metadata request fails.', () => { const issueId = '8785'; - function clickDeleteFrame() { - cy.get('.cvat-player-delete-frame').click(); - cy.get('.cvat-modal-delete-frame').within(() => { - cy.contains('button', 'Delete').click(); - }); - } - function clickSave() { - cy.get('button').contains('Save').click({ force: true }); - cy.get('button').contains('Save').trigger('mouseout'); - } - before(() => { cy.checkDeletedFrameVisibility(); cy.openTaskJob(taskName); @@ -44,10 +33,10 @@ context('The UI remains stable even when the metadata request fails.', () => { cy.intercept(routeMatcher, badResponse).as('patchError'); - clickDeleteFrame(); + cy.clickDeleteFrame(); cy.get('.cvat-player-restore-frame').should('be.visible'); - clickSave(); + cy.clickSave(); cy.wait('@patchError').then((intercept) => { expect(intercept.response.body).to.equal(badResponse.body); expect(intercept.response.statusCode).to.equal(badResponse.statusCode); diff --git a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js index f31af300c3e..ad0c7d83a6e 100644 --- a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js +++ b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js @@ -5,7 +5,6 @@ /// import { taskName } from '../../support/const'; -import { clickDeleteFrame, clickSave } from '../../support/utils_e2e'; context('UI and job metadata work correctly when deleting frames', () => { const chunkReloadPeriod = 100; // 100 ms @@ -34,11 +33,11 @@ context('UI and job metadata work correctly when deleting frames', () => { }); // Delete frame, ignore new request - clickDeleteFrame(); + cy.clickDeleteFrame(); cy.get('.cvat-player-restore-frame').should('not.exist'); // ???: not sure about this one, it might be visible // Save and intercept request to confirm validate deleted frames - clickSave(); + cy.clickSave(); cy.wait('@patchMeta').then((interceptor) => { cy.get(`@${frameAlias}`).then((frameNum) => { expect(interceptor.response.body).to.haveOwnProperty('deleted_frames'); diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index 30fa35dd93b..d9d90c49716 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -1714,3 +1714,15 @@ Cypress.Commands.add('getCurrentFrameNumber', (alias) => { }); }); }); + +Cypress.Commands.add('clickDeleteFrame', (force = false) => { + cy.get('.cvat-player-delete-frame').click(); + cy.get('.cvat-modal-delete-frame').within(() => { + cy.contains('button', 'Delete').click({ force }); + }); +}); + +Cypress.Commands.add('clickSave', (force = false) => { + cy.get('button').contains('Save').click({ force }); + cy.get('button').contains('Save').trigger('mouseout'); +}); diff --git a/tests/cypress/support/utils_e2e.js b/tests/cypress/support/utils_e2e.js index de092fa338d..416d1790954 100644 --- a/tests/cypress/support/utils_e2e.js +++ b/tests/cypress/support/utils_e2e.js @@ -1,15 +1,3 @@ // Copyright (C) 2025 CVAT.ai Corporation // // SPDX-License-Identifier: MIT - -export function clickDeleteFrame() { - cy.get('.cvat-player-delete-frame').click(); - cy.get('.cvat-modal-delete-frame').within(() => { - cy.contains('button', 'Delete').click(); - }); -} - -export function clickSave() { - cy.get('button').contains('Save').click({ force: true }); - cy.get('button').contains('Save').trigger('mouseout'); -} From a5782c9e18c062d34a221c6d3c48d87973122d92 Mon Sep 17 00:00:00 2001 From: Oleg Valiulin Date: Fri, 17 Jan 2025 22:13:04 +0000 Subject: [PATCH 04/11] move before() into describe, catch first request --- .../e2e/issues_prs2/issue_8872_delete_frame.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js index ad0c7d83a6e..5aa80cd49f8 100644 --- a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js +++ b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js @@ -10,20 +10,24 @@ context('UI and job metadata work correctly when deleting frames', () => { const chunkReloadPeriod = 100; // 100 ms let defaultJobMetadataReloadPreiod; - before(() => { - cy.openTaskJob(taskName); - cy.window().then((window) => { - defaultJobMetadataReloadPreiod = window.cvat.config.jobMetaDataReloadPeriod; - window.cvat.config.jobMetaDataReloadPeriod = chunkReloadPeriod; + describe('Attempt to delete any frame after repeated request to /data/meta/', () => { + before(() => { + cy.window().then((window) => { + defaultJobMetadataReloadPreiod = window.cvat.config.jobMetaDataReloadPeriod; + window.cvat.config.jobMetaDataReloadPeriod = chunkReloadPeriod; + }); }); - }); - describe('Attempt to delete any frame after repeated request to /data/meta/', () => { it('Elapse job metadata reload period, delete a frame, validate UI state is and request body ', () => { cy.intercept('GET', '/api/jobs/**/data/meta**').as('getMeta'); cy.intercept('PATCH', '/api/jobs/**/data/meta**').as('patchMeta'); + // Intercept first request after loading the job + cy.openTaskJob(taskName); + cy.wait('@getMeta'); + const frameAlias = 'oldCurrentFrame'; + cy.goToNextFrame(1); cy.wait('@getMeta').then((interceptor) => { expect(interceptor.response.body).to.haveOwnProperty('frames'); From d6e5503b1f3d6c0050481f1a471358ea6eb357c6 Mon Sep 17 00:00:00 2001 From: Oleg Valiulin Date: Fri, 17 Jan 2025 22:35:33 +0000 Subject: [PATCH 05/11] Ensure GET /data/meta's happened, restore state before deletion' --- .../issues_prs2/issue_8872_delete_frame.js | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js index 5aa80cd49f8..df14fb9a8f3 100644 --- a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js +++ b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js @@ -22,42 +22,46 @@ context('UI and job metadata work correctly when deleting frames', () => { cy.intercept('GET', '/api/jobs/**/data/meta**').as('getMeta'); cy.intercept('PATCH', '/api/jobs/**/data/meta**').as('patchMeta'); - // Intercept first request after loading the job cy.openTaskJob(taskName); + // Ensure first request is sent after loading the job cy.wait('@getMeta'); const frameAlias = 'oldCurrentFrame'; cy.goToNextFrame(1); - cy.wait('@getMeta').then((interceptor) => { - expect(interceptor.response.body).to.haveOwnProperty('frames'); + cy.wait('@getMeta').then(() => { // enqueue current frame number // save it in context cy.getCurrentFrameNumber(frameAlias); }); - // Delete frame, ignore new request cy.clickDeleteFrame(); - cy.get('.cvat-player-restore-frame').should('not.exist'); // ???: not sure about this one, it might be visible + cy.get('.cvat-player-restore-frame').should('not.exist'); + cy.wait('@getMeta'); // Save and intercept request to confirm validate deleted frames cy.clickSave(); - cy.wait('@patchMeta').then((interceptor) => { - cy.get(`@${frameAlias}`).then((frameNum) => { - expect(interceptor.response.body).to.haveOwnProperty('deleted_frames'); - const deletedFrames = interceptor.response.body.deleted_frames; - assert(Array.isArray(deletedFrames) && deletedFrames.length === 1); + cy.get(`@${frameAlias}`).then((frameNum) => { + cy.wait('@patchMeta').then((interceptDeleted) => { + const deletedFrames = interceptDeleted.request.body.deleted_frames; // Check old frame is unavailable cy.checkFrameNum(frameNum + 1); - // Check deleted frames are correct - const [actualDeletedFrames, expectedDeletedFrames] = [deletedFrames[0], frameNum]; - expect(actualDeletedFrames).to.equal(expectedDeletedFrames); + // Check deleted frame are correct + expect(deletedFrames).to.include(frameNum); + }); + // Restore state and save + // Validate UI and that no frames are marked deleted + cy.contains('.cvat-annotation-header-button', 'Undo').click(); + cy.clickSave(); + cy.wait('@patchMeta').then((interceptRestored) => { + const deletedFrames = interceptRestored.request.body.deleted_frames; + cy.wrap(deletedFrames).should('be.empty'); + cy.checkFrameNum(frameNum); }); }); }); - after(() => { cy.window().then((window) => { window.cvat.config.jobMetaDataReloadPeriod = defaultJobMetadataReloadPreiod; From d31f244023ab8603f65ce02ceaca4a298d936a79 Mon Sep 17 00:00:00 2001 From: Oleg Valiulin Date: Mon, 20 Jan 2025 19:33:16 +0000 Subject: [PATCH 06/11] set local var instead of alias --- .../issues_prs2/issue_8872_delete_frame.js | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js index df14fb9a8f3..90c5eccd7a3 100644 --- a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js +++ b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js @@ -19,6 +19,13 @@ context('UI and job metadata work correctly when deleting frames', () => { }); it('Elapse job metadata reload period, delete a frame, validate UI state is and request body ', () => { + let frameNum = null; + function getCurrentFrameNumber() { + cy.get('.cvat-player-frame-selector').within(() => cy.get('[role="spinbutton"]') + .should('have.attr', 'aria-valuenow') + .then((valueFrameNow) => { frameNum = Number(valueFrameNow); })); + } + cy.intercept('GET', '/api/jobs/**/data/meta**').as('getMeta'); cy.intercept('PATCH', '/api/jobs/**/data/meta**').as('patchMeta'); @@ -26,40 +33,32 @@ context('UI and job metadata work correctly when deleting frames', () => { // Ensure first request is sent after loading the job cy.wait('@getMeta'); - const frameAlias = 'oldCurrentFrame'; - cy.goToNextFrame(1); - cy.wait('@getMeta').then(() => { - // enqueue current frame number - // save it in context - cy.getCurrentFrameNumber(frameAlias); - }); + cy.wait('@getMeta'); + getCurrentFrameNumber(); cy.clickDeleteFrame(); cy.get('.cvat-player-restore-frame').should('not.exist'); - cy.wait('@getMeta'); // Save and intercept request to confirm validate deleted frames cy.clickSave(); - cy.get(`@${frameAlias}`).then((frameNum) => { - cy.wait('@patchMeta').then((interceptDeleted) => { - const deletedFrames = interceptDeleted.request.body.deleted_frames; + cy.wait('@patchMeta').then((interceptDeleted) => { + const deletedFrames = interceptDeleted.request.body.deleted_frames; - // Check old frame is unavailable - cy.checkFrameNum(frameNum + 1); + // Check old frame is unavailable + cy.checkFrameNum(frameNum + 1); - // Check deleted frame are correct - expect(deletedFrames).to.include(frameNum); - }); - // Restore state and save - // Validate UI and that no frames are marked deleted - cy.contains('.cvat-annotation-header-button', 'Undo').click(); - cy.clickSave(); - cy.wait('@patchMeta').then((interceptRestored) => { - const deletedFrames = interceptRestored.request.body.deleted_frames; - cy.wrap(deletedFrames).should('be.empty'); - cy.checkFrameNum(frameNum); - }); + // Check deleted frame are correct + expect(deletedFrames).to.include(frameNum); + }); + // Restore state and save + // Validate UI and that no frames are marked deleted + cy.contains('.cvat-annotation-header-button', 'Undo').click(); + cy.clickSave(); + cy.wait('@patchMeta').then((interceptRestored) => { + const deletedFrames = interceptRestored.request.body.deleted_frames; + cy.wrap(deletedFrames).should('be.empty'); + cy.checkFrameNum(frameNum); }); }); after(() => { From 14f37191b5b2ee3a00f3cce8c7ea61edc6a7d7e9 Mon Sep 17 00:00:00 2001 From: Oleg Valiulin Date: Mon, 20 Jan 2025 19:38:19 +0000 Subject: [PATCH 07/11] refactor clicking in commands --- tests/cypress/support/commands.js | 18 ++---------------- tests/cypress/support/utils_e2e.js | 3 --- 2 files changed, 2 insertions(+), 19 deletions(-) delete mode 100644 tests/cypress/support/utils_e2e.js diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index d9d90c49716..d18c1a638d8 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -399,8 +399,7 @@ Cypress.Commands.add('openTask', (taskName, projectSubsetFieldValue) => { Cypress.Commands.add('saveJob', (method = 'PATCH', status = 200, as = 'saveJob') => { cy.intercept(method, '/api/jobs/**').as(as); - cy.get('button').contains('Save').click({ force: true }); - cy.get('button').contains('Save').trigger('mouseout'); + cy.clickSave(true); cy.wait(`@${as}`).its('response.statusCode').should('equal', status); }); @@ -1420,10 +1419,7 @@ Cypress.Commands.add('deleteFrame', (action = 'delete') => { if (action === 'restore') { cy.get('.cvat-player-restore-frame').click(); } else if (action === 'delete') { - cy.get('.cvat-player-delete-frame').click(); - cy.get('.cvat-modal-delete-frame').within(() => { - cy.contains('button', 'Delete').click(); - }); + cy.clickDeleteFrame(); } cy.saveJob('PATCH', 200); cy.wait('@patchMeta').its('response.statusCode').should('equal', 200); @@ -1705,16 +1701,6 @@ Cypress.Commands.overwrite('reload', (orig, options) => { cy.closeModalUnsupportedPlatform(); }); -Cypress.Commands.add('getCurrentFrameNumber', (alias) => { - cy.get('.cvat-player-frame-selector').within(() => { - cy.get('[role="spinbutton"]') - .should('have.attr', 'aria-valuenow') - .then((valueFrameNow) => { - cy.wrap(Number(valueFrameNow)).as(alias); - }); - }); -}); - Cypress.Commands.add('clickDeleteFrame', (force = false) => { cy.get('.cvat-player-delete-frame').click(); cy.get('.cvat-modal-delete-frame').within(() => { diff --git a/tests/cypress/support/utils_e2e.js b/tests/cypress/support/utils_e2e.js deleted file mode 100644 index 416d1790954..00000000000 --- a/tests/cypress/support/utils_e2e.js +++ /dev/null @@ -1,3 +0,0 @@ -// Copyright (C) 2025 CVAT.ai Corporation -// -// SPDX-License-Identifier: MIT From 5aff8f2630913157d9d890c01ae0781c62155e64 Mon Sep 17 00:00:00 2001 From: Oleg Valiulin Date: Thu, 23 Jan 2025 12:59:04 +0000 Subject: [PATCH 08/11] rename save and delete and replace equivalent calls --- ...nctionality_dump_upload_annotation_point_cloud_format.js | 6 ++---- ...onality_dump_upload_annotation_velodyne_points_format.js | 6 ++---- .../e2e/issues_prs2/issue_8785_update_job_metadata.js | 6 +++--- tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js | 6 +++--- tests/cypress/support/commands.js | 6 +++--- 5 files changed, 13 insertions(+), 17 deletions(-) diff --git a/tests/cypress/e2e/canvas3d_functionality/case_91_canvas3d_functionality_dump_upload_annotation_point_cloud_format.js b/tests/cypress/e2e/canvas3d_functionality/case_91_canvas3d_functionality_dump_upload_annotation_point_cloud_format.js index 96a555c5520..d11d2297a10 100644 --- a/tests/cypress/e2e/canvas3d_functionality/case_91_canvas3d_functionality_dump_upload_annotation_point_cloud_format.js +++ b/tests/cypress/e2e/canvas3d_functionality/case_91_canvas3d_functionality_dump_upload_annotation_point_cloud_format.js @@ -92,8 +92,7 @@ context('Canvas 3D functionality. Dump/upload annotation. "Point Cloud" format', cy.verifyNotification(); cy.get('#cvat-objects-sidebar-state-item-1').should('exist'); cy.removeAnnotations(); - cy.get('button').contains('Save').click(); - cy.get('button').contains('Save').trigger('mouseout'); + cy.clickSaveAnnotationView(); cy.get('#cvat-objects-sidebar-state-item-1').should('not.exist'); }); @@ -114,8 +113,7 @@ context('Canvas 3D functionality. Dump/upload annotation. "Point Cloud" format', cy.openTaskJob(taskName); cy.get('#cvat-objects-sidebar-state-item-1').should('exist'); cy.removeAnnotations(); - cy.get('button').contains('Save').click(); - cy.get('button').contains('Save').trigger('mouseout'); + cy.clickSaveAnnotationView(); }); }); }); diff --git a/tests/cypress/e2e/canvas3d_functionality/case_92_canvas3d_functionality_dump_upload_annotation_velodyne_points_format.js b/tests/cypress/e2e/canvas3d_functionality/case_92_canvas3d_functionality_dump_upload_annotation_velodyne_points_format.js index 6dcbc306d6d..521a22036f4 100644 --- a/tests/cypress/e2e/canvas3d_functionality/case_92_canvas3d_functionality_dump_upload_annotation_velodyne_points_format.js +++ b/tests/cypress/e2e/canvas3d_functionality/case_92_canvas3d_functionality_dump_upload_annotation_velodyne_points_format.js @@ -93,8 +93,7 @@ context('Canvas 3D functionality. Dump/upload annotation. "Velodyne Points" form cy.closeNotification('.ant-notification-notice-info'); cy.get('#cvat-objects-sidebar-state-item-1').should('exist'); cy.removeAnnotations(); - cy.get('button').contains('Save').click(); - cy.get('button').contains('Save').trigger('mouseout'); + cy.clickSaveAnnotationView(); }); it('Upload annotation to task.', () => { @@ -114,8 +113,7 @@ context('Canvas 3D functionality. Dump/upload annotation. "Velodyne Points" form cy.openTaskJob(taskName); cy.get('#cvat-objects-sidebar-state-item-1').should('exist'); cy.removeAnnotations(); - cy.get('button').contains('Save').click(); - cy.get('button').contains('Save').trigger('mouseout'); + cy.clickSaveAnnotationView(); }); }); }); diff --git a/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js b/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js index ab5329bdd6b..9596aac1e75 100644 --- a/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js +++ b/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js @@ -28,15 +28,15 @@ context('The UI remains stable even when the metadata request fails.', () => { const routeMatcher = { url: '/api/jobs/**/data/meta**', method: 'PATCH', - times: 1, // cancels the intercept without retries + times: 1, // cancels the intercept without retriesf }; cy.intercept(routeMatcher, badResponse).as('patchError'); - cy.clickDeleteFrame(); + cy.clickDeleteFrameAnnotationView(); cy.get('.cvat-player-restore-frame').should('be.visible'); - cy.clickSave(); + cy.clickSaveAnnotationView(); cy.wait('@patchError').then((intercept) => { expect(intercept.response.body).to.equal(badResponse.body); expect(intercept.response.statusCode).to.equal(badResponse.statusCode); diff --git a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js index 90c5eccd7a3..1b2e444bfb0 100644 --- a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js +++ b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js @@ -37,11 +37,11 @@ context('UI and job metadata work correctly when deleting frames', () => { cy.wait('@getMeta'); getCurrentFrameNumber(); - cy.clickDeleteFrame(); + cy.clickDeleteFrameAnnotationView(); cy.get('.cvat-player-restore-frame').should('not.exist'); // Save and intercept request to confirm validate deleted frames - cy.clickSave(); + cy.clickSaveAnnotationView(); cy.wait('@patchMeta').then((interceptDeleted) => { const deletedFrames = interceptDeleted.request.body.deleted_frames; @@ -54,7 +54,7 @@ context('UI and job metadata work correctly when deleting frames', () => { // Restore state and save // Validate UI and that no frames are marked deleted cy.contains('.cvat-annotation-header-button', 'Undo').click(); - cy.clickSave(); + cy.clickSaveAnnotationView(); cy.wait('@patchMeta').then((interceptRestored) => { const deletedFrames = interceptRestored.request.body.deleted_frames; cy.wrap(deletedFrames).should('be.empty'); diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index 9bef00cdcff..ba1b55e6cdc 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -413,7 +413,7 @@ Cypress.Commands.add('openTask', (taskName, projectSubsetFieldValue) => { Cypress.Commands.add('saveJob', (method = 'PATCH', status = 200, as = 'saveJob') => { cy.intercept(method, '/api/jobs/**').as(as); - cy.clickSave(true); + cy.clickSaveAnnotationView(true); cy.wait(`@${as}`).its('response.statusCode').should('equal', status); }); @@ -1715,14 +1715,14 @@ Cypress.Commands.overwrite('reload', (orig, options) => { cy.closeModalUnsupportedPlatform(); }); -Cypress.Commands.add('clickDeleteFrame', (force = false) => { +Cypress.Commands.add('clickDeleteFrameAnnotationView', (force = false) => { cy.get('.cvat-player-delete-frame').click(); cy.get('.cvat-modal-delete-frame').within(() => { cy.contains('button', 'Delete').click({ force }); }); }); -Cypress.Commands.add('clickSave', (force = false) => { +Cypress.Commands.add('clickSaveAnnotationView', (force = false) => { cy.get('button').contains('Save').click({ force }); cy.get('button').contains('Save').trigger('mouseout'); }); From 60e1048bae2fc00c738310f2810032fd81d3bf35 Mon Sep 17 00:00:00 2001 From: Oleg Valiulin Date: Thu, 23 Jan 2025 13:36:11 +0000 Subject: [PATCH 09/11] update command name --- tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js | 2 +- tests/cypress/support/commands.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js b/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js index 9596aac1e75..08b464dcf8a 100644 --- a/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js +++ b/tests/cypress/e2e/issues_prs2/issue_8785_update_job_metadata.js @@ -28,7 +28,7 @@ context('The UI remains stable even when the metadata request fails.', () => { const routeMatcher = { url: '/api/jobs/**/data/meta**', method: 'PATCH', - times: 1, // cancels the intercept without retriesf + times: 1, // cancels the intercept without retries }; cy.intercept(routeMatcher, badResponse).as('patchError'); diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index ba1b55e6cdc..ef6b0ba3d30 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -1433,7 +1433,7 @@ Cypress.Commands.add('deleteFrame', (action = 'delete') => { if (action === 'restore') { cy.get('.cvat-player-restore-frame').click(); } else if (action === 'delete') { - cy.clickDeleteFrame(); + cy.clickDeleteFrameAnnotationView(); } cy.saveJob('PATCH', 200); cy.wait('@patchMeta').its('response.statusCode').should('equal', 200); From 782fb92755fa63b239bd759b72465107be7a44e9 Mon Sep 17 00:00:00 2001 From: Oleg Valiulin Date: Thu, 23 Jan 2025 13:41:18 +0000 Subject: [PATCH 10/11] remove arg --- tests/cypress/support/commands.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index ef6b0ba3d30..bc929c4b558 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -413,7 +413,7 @@ Cypress.Commands.add('openTask', (taskName, projectSubsetFieldValue) => { Cypress.Commands.add('saveJob', (method = 'PATCH', status = 200, as = 'saveJob') => { cy.intercept(method, '/api/jobs/**').as(as); - cy.clickSaveAnnotationView(true); + cy.clickSaveAnnotationView(); cy.wait(`@${as}`).its('response.statusCode').should('equal', status); }); @@ -1715,14 +1715,14 @@ Cypress.Commands.overwrite('reload', (orig, options) => { cy.closeModalUnsupportedPlatform(); }); -Cypress.Commands.add('clickDeleteFrameAnnotationView', (force = false) => { +Cypress.Commands.add('clickDeleteFrameAnnotationView', () => { cy.get('.cvat-player-delete-frame').click(); cy.get('.cvat-modal-delete-frame').within(() => { - cy.contains('button', 'Delete').click({ force }); + cy.contains('button', 'Delete').click(); }); }); -Cypress.Commands.add('clickSaveAnnotationView', (force = false) => { - cy.get('button').contains('Save').click({ force }); +Cypress.Commands.add('clickSaveAnnotationView', () => { + cy.get('button').contains('Save').click(); cy.get('button').contains('Save').trigger('mouseout'); }); From dbae90ea675cdf7c2445c66844e63d8189d4f329 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Thu, 23 Jan 2025 16:42:53 +0200 Subject: [PATCH 11/11] Update tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js Co-authored-by: Kirill Lakhov --- tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js index 1b2e444bfb0..14aff079a82 100644 --- a/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js +++ b/tests/cypress/e2e/issues_prs2/issue_8872_delete_frame.js @@ -1,4 +1,4 @@ -// Copyright (C) 2025 CVAT.ai Corporation +// Copyright (C) CVAT.ai Corporation // // SPDX-License-Identifier: MIT