diff --git a/assets/src/bundles/add_forge/add-request-history-item.ejs b/assets/src/bundles/add_forge/add-request-history-item.ejs --- a/assets/src/bundles/add_forge/add-request-history-item.ejs +++ b/assets/src/bundles/add_forge/add-request-history-item.ejs @@ -6,7 +6,7 @@ %>
-
+

-
+

<%= event.text %>

<%if (event.new_status !== null) { %> diff --git a/cypress/fixtures/add-forge-now-request.json b/cypress/fixtures/add-forge-now-request.json deleted file mode 100644 --- a/cypress/fixtures/add-forge-now-request.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "request":{ - "id":1, - "status":"PENDING", - "submission_date":"2022-03-17T13:35:24.324848Z", - "submitter_name":"admin", - "submitter_email":"admin@swh-web.org", - "forge_type":"bitbucket", - "forge_url":"test.com", - "forge_contact_email":"test@example.com", - "forge_contact_name":"test user", - "forge_contact_comment":"test comment" - },"history":[ - { - "id":1, - "text":"", - "actor":"admin", - "actor_role":"SUBMITTER", - "date":"2022-03-17T13:35:24.326190Z", - "new_status":"PENDING" - } - ] -} diff --git a/cypress/integration/add-forge-now-request-dashboard.spec.js b/cypress/integration/add-forge-now-request-dashboard.spec.js --- a/cypress/integration/add-forge-now-request-dashboard.spec.js +++ b/cypress/integration/add-forge-now-request-dashboard.spec.js @@ -5,20 +5,54 @@ * See top-level LICENSE file for more information */ -const requestId = 1; +let requestId; + +function createDummyRequest(urls) { + cy.task('db:add_forge_now:delete'); + cy.userLogin(); + + cy.getCookie('csrftoken').its('value').then((token) => { + cy.request({ + method: 'POST', + url: urls.api_1_add_forge_request_create(), + body: { + forge_type: 'bitbucket', + forge_url: 'test.example.com', + forge_contact_email: 'test@example.com', + forge_contact_name: 'test user', + submitter_forward_username: true, + forge_contact_comment: 'test comment' + }, + headers: { + 'X-CSRFToken': token + } + }).then((response) => { + // setting requestId from response + requestId = response.body.id; + // logout the user + cy.visit(urls.swh_web_homepage()); + cy.contains('a', 'logout').click(); + }); + }); +} describe('Test add forge now request dashboard load', function() { + before(function() { + // Create an add-forge-request object in the DB + createDummyRequest(this.Urls); + }); + beforeEach(function() { const url = this.Urls.add_forge_now_request_dashboard(requestId); + // request dashboard require admin permissions to view cy.adminLogin(); - cy.intercept(`${this.Urls.api_1_add_forge_request_get(requestId)}**`, - {fixture: 'add-forge-now-request'}).as('forgeAddRequest'); + cy.intercept(`${this.Urls.api_1_add_forge_request_get(requestId)}**`).as('forgeRequestGet'); cy.visit(url); }); it('should load add forge request details', function() { - cy.wait('@forgeAddRequest'); + cy.wait('@forgeRequestGet'); cy.get('#requestStatus') .should('contain', 'Pending'); @@ -26,7 +60,7 @@ .should('contain', 'bitbucket'); cy.get('#requestURL') - .should('contain', 'test.com'); + .should('contain', 'test.example.com'); cy.get('#requestContactEmail') .should('contain', 'test@example.com'); @@ -34,9 +68,31 @@ cy.get('#requestContactName') .should('contain', 'test user'); + cy.get('#requestContactEmail') + .should('contain', 'test@example.com'); + + cy.get('#requestContactConsent') + .should('contain', 'true'); + + cy.get('#submitterMessage') + .should('contain', 'test comment'); + }); + + it('should show send message link', function() { + cy.wait('@forgeRequestGet'); + + cy.get('#contactForgeAdmin') + .should('have.attr', 'emailto') + .and('include', 'test@example.com'); + + cy.get('#contactForgeAdmin') + .should('have.attr', 'emailsubject') + .and('include', `[swh-add_forge_now] Request ${requestId}`); }); it('should not show any error message', function() { + cy.wait('@forgeRequestGet'); + cy.get('#fetchError') .should('have.class', 'd-none'); cy.get('#requestDetails') @@ -44,7 +100,8 @@ }); it('should show error message for an api error', function() { - const invalidRequestId = 2; + // requesting with a non existing request ID + const invalidRequestId = requestId + 10; const url = this.Urls.add_forge_now_request_dashboard(invalidRequestId); cy.intercept(`${this.Urls.api_1_add_forge_request_get(invalidRequestId)}**`, @@ -59,6 +116,8 @@ }); it('should load add forge request history', function() { + cy.wait('@forgeRequestGet'); + cy.get('#requestHistory') .children() .should('have.length', 1); @@ -66,12 +125,105 @@ cy.get('#requestHistory') .children() .should('contain', 'New status: Pending'); + + cy.get('#requestHistory') + .should('contain', 'From user (SUBMITTER)'); }); it('should load possible next status', function() { + cy.wait('@forgeRequestGet'); // 3 possible next status and the comment option cy.get('#decisionOptions') .children() .should('have.length', 4); }); }); + +function populateAndSubmitForm() { + cy.get('#decisionOptions').select('WAITING_FOR_FEEDBACK'); + cy.get('#updateComment').type('This is an update comment'); + cy.get('#updateRequestForm').submit(); +} + +describe('Test forge now request update', function() { + + beforeEach(function() { + createDummyRequest(this.Urls); + + const url = this.Urls.add_forge_now_request_dashboard(requestId); + cy.adminLogin(); + // intercept GET API on page load + cy.intercept(`${this.Urls.api_1_add_forge_request_get(requestId)}**`).as('forgeRequestGet'); + // intercept update POST API + cy.intercept('POST', `${this.Urls.api_1_add_forge_request_update(requestId)}**`).as('forgeRequestUpdate'); + cy.visit(url); + }); + + it('should submit correct details', function() { + cy.wait('@forgeRequestGet'); + populateAndSubmitForm(); + + // Making sure posting the right data + cy.wait('@forgeRequestUpdate').its('request.body') + .should('include', 'new_status') + .should('include', 'text') + .should('include', 'WAITING_FOR_FEEDBACK'); + }); + + it('should show success message', function() { + cy.wait('@forgeRequestGet'); + populateAndSubmitForm(); + + // Making sure showing the success message + cy.wait('@forgeRequestUpdate'); + cy.get('#userMessage') + .should('contain', 'The request status has been updated') + .should('not.have.class', 'badge-danger') + .should('have.class', 'badge-success'); + }); + + it('should update the dashboard after submit', function() { + cy.wait('@forgeRequestGet'); + populateAndSubmitForm(); + + // Making sure the UI is updated after the submit + cy.wait('@forgeRequestGet'); + cy.get('#requestStatus') + .should('contain', 'Waiting for feedback'); + + cy.get('#requestHistory') + .children() + .should('have.length', 2); + + cy.get('#requestHistory') + .children() + .should('contain', 'New status: Waiting for feedback'); + + cy.get('#requestHistory') + .children() + .should('contain', 'This is an update comment'); + + cy.get('#requestHistory') + .children() + .should('contain', 'Status changed to: Waiting for feedback'); + + cy.get('#decisionOptions') + .children() + .should('have.length', 2); + }); + + it('should show an error on API failure', function() { + cy.intercept('POST', + `${this.Urls.api_1_add_forge_request_update(requestId)}**`, + {forceNetworkError: true}) + .as('updateFailedRequest'); + cy.get('#updateComment').type('This is an update comment'); + cy.get('#updateRequestForm').submit(); + + cy.wait('@updateFailedRequest'); + cy.get('#userMessage') + .should('contain', 'Sorry; Updating the request failed') + .should('have.class', 'badge-danger') + .should('not.have.class', 'badge-success'); + }); +}); diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js --- a/cypress/plugins/index.js +++ b/cypress/plugins/index.js @@ -149,8 +149,13 @@ }, 'db:add_forge_now:delete': () => { const db = getDatabase(); + db.serialize(function() { + db.run('DELETE FROM add_forge_request_history'); + db.run('DELETE FROM sqlite_sequence WHERE name="add_forge_request_history"'); + }); db.serialize(function() { db.run('DELETE FROM add_forge_request'); + db.run('DELETE FROM sqlite_sequence WHERE name="add_forge_request"'); }); db.close(); return true;