Changeset View
Changeset View
Standalone View
Standalone View
cypress/integration/origin-save.spec.js
Show All 30 Lines | function checkAlertVisible(alertType, msg) { | ||||
cy.get('#swh-origin-save-request-status') | cy.get('#swh-origin-save-request-status') | ||||
.should('be.visible') | .should('be.visible') | ||||
.find(`.alert-${alertType}`) | .find(`.alert-${alertType}`) | ||||
.should('be.visible') | .should('be.visible') | ||||
.and('contain', msg); | .and('contain', msg); | ||||
} | } | ||||
// Stub requests to save an origin | // Stub requests to save an origin | ||||
function stubSaveRequest(requestUrl, objectType, status, originUrl, taskStatus, | function stubSaveRequest({ | ||||
responseStatus = 200, errorMessage = '') { | requestUrl, | ||||
visitType = 'git', | |||||
saveRequestStatus, | |||||
originUrl, | |||||
saveTaskStatus, | |||||
responseStatus = 200, | |||||
errorMessage = '', | |||||
saveRequestDate = new Date(), | |||||
visitDate = new Date() | |||||
} = {}) { | |||||
let response; | let response; | ||||
if (responseStatus !== 200 && errorMessage) { | if (responseStatus !== 200 && errorMessage) { | ||||
response = {'detail': errorMessage}; | response = { | ||||
'detail': errorMessage | |||||
}; | |||||
} else { | } else { | ||||
response = genOriginSaveResponse(objectType, status, originUrl, Date().toString(), taskStatus); | response = genOriginSaveResponse({visitType: visitType, | ||||
saveRequestStatus: saveRequestStatus, | |||||
originUrl: originUrl, | |||||
saveRequestDate: saveRequestDate, | |||||
saveTaskStatus: saveTaskStatus, | |||||
visitDate: visitDate}); | |||||
} | } | ||||
cy.route({ | cy.route({ | ||||
method: 'POST', | method: 'POST', | ||||
status: responseStatus, | status: responseStatus, | ||||
url: requestUrl, | url: requestUrl, | ||||
response: response | response: response | ||||
}).as('saveRequest'); | }).as('saveRequest'); | ||||
} | } | ||||
// Mocks API response : /save/(:object_type)/(:origin_url) | // Mocks API response : /save/(:visit_type)/(:origin_url) | ||||
// object_type : {'git', 'hg', 'svn'} | // visit_type : {'git', 'hg', 'svn'} | ||||
function genOriginSaveResponse(objectType, saveRequestStatus, originUrl, saveRequestDate, saveTaskStatus, visitDate = Date().toString()) { | function genOriginSaveResponse({ | ||||
visitType = 'git', | |||||
saveRequestStatus, | |||||
originUrl, | |||||
saveRequestDate = new Date(), | |||||
saveTaskStatus, | |||||
visitDate = new Date() | |||||
} = {}) { | |||||
return { | return { | ||||
'visit_type': objectType, | 'visit_type': visitType, | ||||
'save_request_status': saveRequestStatus, | 'save_request_status': saveRequestStatus, | ||||
'origin_url': originUrl, | 'origin_url': originUrl, | ||||
'id': 1, | 'id': 1, | ||||
'save_request_date': saveRequestDate, | 'save_request_date': saveRequestDate ? saveRequestDate.toISOString() : null, | ||||
'save_task_status': saveTaskStatus, | 'save_task_status': saveTaskStatus, | ||||
'visit_date': visitDate | 'visit_date': visitDate ? visitDate.toISOString() : null | ||||
}; | }; | ||||
}; | }; | ||||
describe('Origin Save Tests', function() { | describe('Origin Save Tests', function() { | ||||
before(function() { | before(function() { | ||||
url = this.Urls.origin_save(); | url = this.Urls.origin_save(); | ||||
origin = this.origin[0]; | origin = this.origin[0]; | ||||
this.originSaveUrl = this.Urls.origin_save_request(origin.type, origin.url); | this.originSaveUrl = this.Urls.origin_save_request(origin.type, origin.url); | ||||
}); | }); | ||||
beforeEach(function() { | beforeEach(function() { | ||||
cy.fixture('origin-save').as('originSaveJSON'); | cy.fixture('origin-save').as('originSaveJSON'); | ||||
cy.fixture('save-task-info').as('saveTaskInfoJSON'); | cy.fixture('save-task-info').as('saveTaskInfoJSON'); | ||||
cy.visit(url); | cy.visit(url); | ||||
cy.server(); | cy.server(); | ||||
}); | }); | ||||
it('should display accepted message when accepted', function() { | it('should display accepted message when accepted', function() { | ||||
stubSaveRequest(this.originSaveUrl, origin.type, 'accepted', | stubSaveRequest({requestUrl: this.originSaveUrl, | ||||
origin.url, 'not yet scheduled'); | saveRequestStatus: 'accepted', | ||||
originUrl: origin.url, | |||||
saveTaskStatus: 'not yet scheduled'}); | |||||
makeOriginSaveRequest(origin.type, origin.url); | makeOriginSaveRequest(origin.type, origin.url); | ||||
cy.wait('@saveRequest').then(() => { | cy.wait('@saveRequest').then(() => { | ||||
checkAlertVisible('success', saveCodeMsg['success']); | checkAlertVisible('success', saveCodeMsg['success']); | ||||
}); | }); | ||||
}); | }); | ||||
it('should validate gitlab subproject url', function() { | it('should validate gitlab subproject url', function() { | ||||
const gitlabSubProjectUrl = 'https://gitlab.com/user/project/sub/'; | const gitlabSubProjectUrl = 'https://gitlab.com/user/project/sub/'; | ||||
const originSaveUrl = this.Urls.origin_save_request('git', gitlabSubProjectUrl); | const originSaveUrl = this.Urls.origin_save_request('git', gitlabSubProjectUrl); | ||||
stubSaveRequest(originSaveUrl, 'git', 'accepted', | |||||
gitlabSubProjectUrl, 'not yet scheduled'); | stubSaveRequest({requestUrl: originSaveUrl, | ||||
saveRequestStatus: 'accepted', | |||||
originurl: gitlabSubProjectUrl, | |||||
saveTaskStatus: 'not yet scheduled'}); | |||||
makeOriginSaveRequest('git', gitlabSubProjectUrl); | makeOriginSaveRequest('git', gitlabSubProjectUrl); | ||||
cy.wait('@saveRequest').then(() => { | cy.wait('@saveRequest').then(() => { | ||||
checkAlertVisible('success', saveCodeMsg['success']); | checkAlertVisible('success', saveCodeMsg['success']); | ||||
}); | }); | ||||
}); | }); | ||||
it('should display warning message when pending', function() { | it('should display warning message when pending', function() { | ||||
stubSaveRequest(this.originSaveUrl, origin.type, 'pending', | stubSaveRequest({requestUrl: this.originSaveUrl, | ||||
origin.url, 'not created'); | saveRequestStatus: 'pending', | ||||
originUrl: origin.url, | |||||
saveTaskStatus: 'not created'}); | |||||
makeOriginSaveRequest(origin.type, origin.url); | makeOriginSaveRequest(origin.type, origin.url); | ||||
cy.wait('@saveRequest').then(() => { | cy.wait('@saveRequest').then(() => { | ||||
checkAlertVisible('warning', saveCodeMsg['warning']); | checkAlertVisible('warning', saveCodeMsg['warning']); | ||||
}); | }); | ||||
}); | }); | ||||
it('should show error when csrf validation failed (status: 403)', function() { | it('should show error when csrf validation failed (status: 403)', function() { | ||||
stubSaveRequest(this.originSaveUrl, origin.type, 'rejected', | stubSaveRequest({requestUrl: this.originSaveUrl, | ||||
origin.url, 'not created', 403, saveCodeMsg['csrfError']); | saveRequestStatus: 'rejected', | ||||
originUrl: origin.url, | |||||
saveTaskStatus: 'not created', | |||||
responseStatus: 403, | |||||
errorMessage: saveCodeMsg['csrfError']}); | |||||
makeOriginSaveRequest(origin.type, origin.url); | makeOriginSaveRequest(origin.type, origin.url); | ||||
cy.wait('@saveRequest').then(() => { | cy.wait('@saveRequest').then(() => { | ||||
checkAlertVisible('danger', saveCodeMsg['csrfError']); | checkAlertVisible('danger', saveCodeMsg['csrfError']); | ||||
}); | }); | ||||
}); | }); | ||||
it('should show error when origin is rejected (status: 403)', function() { | it('should show error when origin is rejected (status: 403)', function() { | ||||
stubSaveRequest(this.originSaveUrl, origin.type, 'rejected', | stubSaveRequest({requestUrl: this.originSaveUrl, | ||||
origin.url, 'not created', 403, saveCodeMsg['rejected']); | saveRequestStatus: 'rejected', | ||||
originUrl: origin.url, | |||||
saveTaskStatus: 'not created', | |||||
responseStatus: 403, | |||||
errorMessage: saveCodeMsg['rejected']}); | |||||
makeOriginSaveRequest(origin.type, origin.url); | makeOriginSaveRequest(origin.type, origin.url); | ||||
cy.wait('@saveRequest').then(() => { | cy.wait('@saveRequest').then(() => { | ||||
checkAlertVisible('danger', saveCodeMsg['rejected']); | checkAlertVisible('danger', saveCodeMsg['rejected']); | ||||
}); | }); | ||||
}); | }); | ||||
it('should show error when rate limited (status: 429)', function() { | it('should show error when rate limited (status: 429)', function() { | ||||
stubSaveRequest(this.originSaveUrl, origin.type, | stubSaveRequest({requestUrl: this.originSaveUrl, | ||||
'Request was throttled. Expected available in 60 seconds.', | saveRequestStatus: 'Request was throttled. Expected available in 60 seconds.', | ||||
origin.url, 'not created', 429); | originUrl: origin.url, | ||||
saveTaskStatus: 'not created', | |||||
responseStatus: 429}); | |||||
makeOriginSaveRequest(origin.type, origin.url); | makeOriginSaveRequest(origin.type, origin.url); | ||||
cy.wait('@saveRequest').then(() => { | cy.wait('@saveRequest').then(() => { | ||||
checkAlertVisible('danger', saveCodeMsg['rateLimit']); | checkAlertVisible('danger', saveCodeMsg['rateLimit']); | ||||
}); | }); | ||||
}); | }); | ||||
it('should show error when unknown error occurs (status other than 200, 403, 429)', function() { | it('should show error when unknown error occurs (status other than 200, 403, 429)', function() { | ||||
stubSaveRequest(this.originSaveUrl, origin.type, 'Error', | stubSaveRequest({requestUrl: this.originSaveUrl, | ||||
origin.url, 'not created', 406); | saveRequestStatus: 'Error', | ||||
originUrl: origin.url, | |||||
saveTaskStatus: 'not created', | |||||
responseStatus: 406}); | |||||
makeOriginSaveRequest(origin.type, origin.url); | makeOriginSaveRequest(origin.type, origin.url); | ||||
cy.wait('@saveRequest').then(() => { | cy.wait('@saveRequest').then(() => { | ||||
checkAlertVisible('danger', saveCodeMsg['unknownError']); | checkAlertVisible('danger', saveCodeMsg['unknownError']); | ||||
}); | }); | ||||
}); | }); | ||||
Show All 23 Lines | cy.get('tbody tr').then(rows => { | ||||
assert.equal($(cells[4]).text(), saveStatus); | assert.equal($(cells[4]).text(), saveStatus); | ||||
++i; | ++i; | ||||
} | } | ||||
}); | }); | ||||
}); | }); | ||||
it('should not add timestamp to the browse origin URL is no visit date has been found', function() { | it('should not add timestamp to the browse origin URL is no visit date has been found', function() { | ||||
const originUrl = 'https://git.example.org/example.git'; | const originUrl = 'https://git.example.org/example.git'; | ||||
const saveRequestData = genOriginSaveResponse('git', 'accepted', originUrl, Date().toString(), 'succeed', null); | const saveRequestData = genOriginSaveResponse({ | ||||
saveRequestStatus: 'accepted', | |||||
originUrl: originUrl, | |||||
saveTaskStatus: 'succeed', | |||||
visitDate: null | |||||
}); | |||||
const saveRequestsListData = { | const saveRequestsListData = { | ||||
'recordsTotal': 1, | 'recordsTotal': 1, | ||||
'draw': 2, | 'draw': 2, | ||||
'recordsFiltered': 1, | 'recordsFiltered': 1, | ||||
'data': [saveRequestData] | 'data': [saveRequestData] | ||||
}; | }; | ||||
cy.route('GET', '/save/requests/list/**', saveRequestsListData); | cy.route('GET', '/save/requests/list/**', saveRequestsListData); | ||||
cy.get('#swh-origin-save-requests-list-tab').click(); | cy.get('#swh-origin-save-requests-list-tab').click(); | ||||
▲ Show 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | cy.get('tbody tr').eq(0).then(row => { | ||||
const cells = row[0].cells; | const cells = row[0].cells; | ||||
cy.get('#swh-input-visit-type') | cy.get('#swh-input-visit-type') | ||||
.should('have.value', $(cells[1]).text()); | .should('have.value', $(cells[1]).text()); | ||||
cy.get('#swh-input-origin-url') | cy.get('#swh-input-origin-url') | ||||
.should('have.value', $(cells[2]).text().slice(0, -1)); | .should('have.value', $(cells[2]).text().slice(0, -1)); | ||||
}); | }); | ||||
}); | }); | ||||
it('should select correct origin type if possible when clicking on "Save again" button', function() { | it('should select correct visit type if possible when clicking on "Save again" button', function() { | ||||
const originUrl = 'https://gitlab.inria.fr/solverstack/maphys/maphys/'; | const originUrl = 'https://gitlab.inria.fr/solverstack/maphys/maphys/'; | ||||
const badOriginType = 'hg'; | const badVisitType = 'hg'; | ||||
const goodOriginType = 'git'; | const goodVisitType = 'git'; | ||||
cy.route('GET', '/save/requests/list/**', '@originSaveJSON'); | cy.route('GET', '/save/requests/list/**', '@originSaveJSON'); | ||||
stubSaveRequest(this.Urls.origin_save_request(badOriginType, originUrl), | stubSaveRequest({requestUrl: this.Urls.origin_save_request(badVisitType, originUrl), | ||||
badOriginType, 'accepted', | visitType: badVisitType, | ||||
originUrl, 'failed', 200, saveCodeMsg['accepted']); | saveRequestStatus: 'accepted', | ||||
originUrl: originUrl, | |||||
saveTaskStatus: 'failed', | |||||
responseStatus: 200, | |||||
errorMessage: saveCodeMsg['accepted']}); | |||||
makeOriginSaveRequest(badOriginType, originUrl); | makeOriginSaveRequest(badVisitType, originUrl); | ||||
cy.get('#swh-origin-save-requests-list-tab').click(); | cy.get('#swh-origin-save-requests-list-tab').click(); | ||||
cy.wait('@saveRequest').then(() => { | cy.wait('@saveRequest').then(() => { | ||||
cy.get('.swh-save-origin-again') | cy.get('.swh-save-origin-again') | ||||
.eq(0) | .eq(0) | ||||
.click(); | .click(); | ||||
cy.get('tbody tr').eq(0).then(row => { | cy.get('tbody tr').eq(0).then(row => { | ||||
const cells = row[0].cells; | const cells = row[0].cells; | ||||
cy.get('#swh-input-visit-type') | cy.get('#swh-input-visit-type') | ||||
.should('have.value', goodOriginType); | .should('have.value', goodVisitType); | ||||
cy.get('#swh-input-origin-url') | cy.get('#swh-input-origin-url') | ||||
.should('have.value', $(cells[2]).text().slice(0, -1)); | .should('have.value', $(cells[2]).text().slice(0, -1)); | ||||
}); | }); | ||||
}); | }); | ||||
}); | }); | ||||
}); | }); |