-
Notifications
You must be signed in to change notification settings - Fork 3.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
E2E test of issue #8785: Undefined when reading getUpdated #8843
base: develop
Are you sure you want to change the base?
Conversation
Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughThe pull request introduces a new Cypress end-to-end test file targeting issue #8785, which focuses on handling job metadata inconsistencies after frame deletion. The test simulates a scenario where a job might crash during saving after removing a frame. It includes functions to delete a frame, save a job, and implements a middleware to intercept and manage PATCH request responses, ensuring robust error handling and recovery mechanisms. Changes
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
🧹 Nitpick comments (5)
tests/cypress/e2e/issues_prs2/issue_8785_Cannot_read_properties_of_undefined_reading_getUpdated.js (5)
7-7
: Consider using more specific importsInstead of importing the entire
const
file, consider destructuring only the requiredtaskName
constant for better code maintainability and clarity.-import { taskName } from '../../support/const'; +import type { taskName } from '../../support/const';
9-15
: Improve test setup documentation and constantsConsider the following improvements:
- Document why frame 4 is specifically chosen for the test
- Extract the frame number into a named constant
+const TEST_FRAME_NUMBER = 4; // Document why this frame is chosen context('When saving after deleting a frame, job metadata is inconsistent.', () => { const issueId = '8785'; before(() => { cy.openTaskJob(taskName); - cy.goToNextFrame(4); + cy.goToNextFrame(TEST_FRAME_NUMBER); });
35-36
: Remove debug console.log statementsDebug logging statements should be removed from the test code.
if (calls === 0) { - console.log(calls); calls++; res.send(badResponseStub); } else { - console.log(calls); req.continue({ statusCode: 200, body: 'OK' }); }Also applies to: 39-40
52-69
: Address TODO and FIXME commentsThere are several unresolved comments that need attention:
- TODO: refactor saveJob with necessary status
- FIXME: assertions and response stubbing comments
Please either implement the suggested changes or create issues to track these improvements.
Would you like me to help create GitHub issues to track these improvements?
70-74
: Consider consolidating save job testsThe consecutive save job tests with different status codes could be combined into a more descriptive test case using
cy.then()
for better flow control.-// Send bad PATCH -cy.saveJob('PATCH', 502); - -// Send again -cy.saveJob('PATCH', 200); +cy.then(() => { + // First attempt should fail + cy.saveJob('PATCH', 502).then(() => { + // Second attempt should succeed + cy.saveJob('PATCH', 200); + }); +});
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
tests/cypress/e2e/issues_prs2/issue_8785_Cannot_read_properties_of_undefined_reading_getUpdated.js
(1 hunks)
|
||
// TODO: refactor saveJob with necessary status | ||
|
||
// Check that frame is deleted |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add missing frame deletion assertions
The comment indicates a need for frame deletion verification, but no assertions are implemented. Consider adding appropriate checks.
// Add these assertions after line 54
cy.get('.cvat-player-frame-selector').should('have.value', TEST_FRAME_NUMBER - 1);
cy.get('.cvat-player-restore-frame').should('exist');
function middleware() { | ||
let calls = 0; | ||
const badResponseStub = { statusCode: 502, body: 'Network error' }; | ||
function handle(req, res) { | ||
if (calls === 0) { | ||
console.log(calls); | ||
calls++; | ||
res.send(badResponseStub); | ||
} else { | ||
console.log(calls); | ||
req.continue({ statusCode: 200, body: 'OK' }); | ||
} | ||
} | ||
return handle; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Improve middleware implementation
The middleware implementation could benefit from several improvements:
- Add error handling for edge cases
- Use typed response objects
- Add logging for debugging purposes
function middleware() {
let calls = 0;
- const badResponseStub = { statusCode: 502, body: 'Network error' };
+ const badResponseStub = {
+ statusCode: 502,
+ body: { error: 'Network error' },
+ headers: { 'content-type': 'application/json' },
+ };
function handle(req, res) {
+ try {
if (calls === 0) {
calls++;
res.send(badResponseStub);
} else {
req.continue({ statusCode: 200, body: 'OK' });
}
+ } catch (error) {
+ cy.log(`Middleware error: ${error.message}`);
+ throw error;
+ }
}
return handle;
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
function middleware() { | |
let calls = 0; | |
const badResponseStub = { statusCode: 502, body: 'Network error' }; | |
function handle(req, res) { | |
if (calls === 0) { | |
console.log(calls); | |
calls++; | |
res.send(badResponseStub); | |
} else { | |
console.log(calls); | |
req.continue({ statusCode: 200, body: 'OK' }); | |
} | |
} | |
return handle; | |
} | |
function middleware() { | |
let calls = 0; | |
const badResponseStub = { | |
statusCode: 502, | |
body: { error: 'Network error' }, | |
headers: { 'content-type': 'application/json' }, | |
}; | |
function handle(req, res) { | |
try { | |
if (calls === 0) { | |
calls++; | |
res.send(badResponseStub); | |
} else { | |
req.continue({ statusCode: 200, body: 'OK' }); | |
} | |
} catch (error) { | |
cy.log(`Middleware error: ${error.message}`); | |
throw error; | |
} | |
} | |
return handle; | |
} |
Please retry analysis of this Pull-Request directly on SonarQube Cloud |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## develop #8843 +/- ##
===========================================
+ Coverage 73.88% 73.92% +0.03%
===========================================
Files 408 408
Lines 44104 44104
Branches 3986 3986
===========================================
+ Hits 32586 32603 +17
+ Misses 11518 11501 -17
|
...cypress/e2e/issues_prs2/issue_8785_Cannot_read_properties_of_undefined_reading_getUpdated.js
Outdated
Show resolved
Hide resolved
|
||
cy.intercept(routeMatcher, badResponse).as('patchError'); | ||
|
||
clickDelete(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
clickDelete(); | |
clickDeleteFrame(); |
.gitignore
Outdated
@@ -49,8 +49,9 @@ yarn-error.log* | |||
|
|||
# Ignore all the installed packages | |||
node_modules | |||
venv/ | |||
venv*/ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I noticed a slight inconsistency here. We have /.*env*
on line 7 in this file. Let’s move line 7 here so that all the ignored package rules are grouped together in one place.
.gitignore
Outdated
.venv/ | ||
.env/ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldnt /.*env*
already cover this case?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Lets name this issue_8785_update_job_metadata
|
||
import { taskName } from '../../support/const'; | ||
|
||
context('When saving after deleting a frame, job metadata is inconsistent.', () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
context('When saving after deleting a frame, job metadata is inconsistent.', () => { | |
context('The UI remains stable even when the metadata request fails.', () => { |
function checkDeletedFrameVisibility() { | ||
cy.openSettings(); | ||
cy.get('.cvat-workspace-settings-show-deleted').within(() => { | ||
cy.get('[type="checkbox"]').should('not.be.checked').check(); | ||
}); | ||
cy.closeSettings(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The code of this funcion is duplicated from case_delete_frame
. Lets create a support command that will change this settings and use it here and in case_delete_frame
.
cy.on('uncaught:exception', (err) => { | ||
expect(err.code).to.equal(badResponse.statusCode); | ||
return false; | ||
}); // On 502, Cypres always triggers a Node exception |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We dont really need this comment
const badResponse = { statusCode: 502, body: 'A horrible network error' }; | ||
|
||
cy.on('uncaught:exception', (err) => { | ||
expect(err.code).to.equal(badResponse.statusCode); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it possible to additionally check that error message is badResponse.body
?
Co-authored-by: Andrey Zhavoronkov <andrey@cvat.ai>
… ran both tests ok
Quality Gate passedIssues Measures |
Adding a test to reproduce the issue fixed in GH-8785
Motivation and context
The issue dealt with inconsistent state of the user's job cache after he deletes a frame, tries to save the job, suddenly gets an unexpected network error from the server, then tries to save the job again.
How has this been tested?
Arranged state (before() hook)
Test case
Checklist
develop
branch(cvat-canvas,
cvat-core,
cvat-data and
cvat-ui)
License
Feel free to contact the maintainers if that's a concern.
Summary by CodeRabbit
New Features
Bug Fixes