Changeset View
Changeset View
Standalone View
Standalone View
cypress/integration/vault.spec.js
- This file was added.
/** | |||||
* Copyright (C) 2019 The Software Heritage developers | |||||
* See the AUTHORS file at the top-level directory of this distribution | |||||
* License: GNU Affero General Public License version 3, or any later version | |||||
* See top-level LICENSE file for more information | |||||
*/ | |||||
const vaultItems = []; | |||||
function createVaultCookingTask(objectType) { | |||||
cy.contains('button', 'Actions') | |||||
.click(); | |||||
cy.contains('.dropdown-item', 'Download') | |||||
.click(); | |||||
cy.contains('.dropdown-item', objectType) | |||||
.click(); | |||||
cy.get('.modal-dialog') | |||||
.contains('button:visible', 'Ok') | |||||
.click(); | |||||
} | |||||
function genVaultCookingResponse(objectType, objectId, status, message, fetchUrl) { | |||||
return { | |||||
'obj_type': objectType, | |||||
'id': 1, | |||||
'progress_message': message, | |||||
'status': status, | |||||
'obj_id': objectId, | |||||
'fetch_url': fetchUrl | |||||
}; | |||||
}; | |||||
function testProgressbar(taskid, color, status) { | |||||
cy.get(`.swh-vault-table #vault-task-${taskid}`) | |||||
.should('be.visible') | |||||
.find('.progress-bar') | |||||
.should('be.visible') | |||||
vlorentz: These should have a comment explaining they are used to mock an API endpoint (and the name of… | |||||
.and('have.css', 'background-color', color) | |||||
.and('contain', status); | |||||
} | |||||
describe('Vault Cooking User Interface Tests', function() { | |||||
before(function() { | |||||
this.directory = this.origin[0].directory[0].id; | |||||
this.directoryUrl = this.Urls.browse_directory(this.directory); | |||||
this.vaultDirectoryUrl = this.Urls.api_1_vault_cook_directory(this.directory); | |||||
this.vaultFetchDirectoryUrl = this.Urls.api_1_vault_fetch_directory(this.directory); | |||||
this.revision = this.origin[1].revision[0]; | |||||
this.revisionUrl = this.Urls.browse_revision(this.revision); | |||||
this.vaultRevisionUrl = this.Urls.api_1_vault_cook_revision_gitfast(this.revision); | |||||
this.vaultFetchRevisionUrl = this.Urls.api_1_vault_fetch_revision_gitfast(this.revision); | |||||
vaultItems[0] = { | |||||
'object_type': 'revision', | |||||
'object_id': this.revision, | |||||
'email': '', | |||||
'status': 'done', | |||||
'fetch_url': `/api/1/vault/revision/${this.revision}/gitfast/raw/`, | |||||
'progress_message': null | |||||
}; | |||||
}); | |||||
beforeEach(function() { | |||||
this.genVaultDirCookingResponse = (status, message = null) => { | |||||
return genVaultCookingResponse('directory', this.directory, status, | |||||
message, this.vaultFetchDirectoryUrl); | |||||
}; | |||||
this.genVaultRevCookingResponse = (status, message = null) => { | |||||
return genVaultCookingResponse('revision', this.revision, status, | |||||
message, this.vaultFetchRevisionUrl); | |||||
Not Done Inline ActionsRename this to sha1 or just id. object_id has a different meaning in other parts of SWH (it's an integer). vlorentz: Rename this to `sha1` or just `id`. `object_id` has a different meaning in other parts of SWH… | |||||
Done Inline ActionsVault item object is as it is stored in local storage. kalpitk: Vault item object is as it is stored in local storage. | |||||
Not Done Inline ActionsMeh. Ok then. vlorentz: Meh. Ok then. | |||||
}; | |||||
cy.server(); | |||||
}); | |||||
it('should create a directory cooking task and report its status', function() { | |||||
// Browse a directory | |||||
cy.visit(this.directoryUrl); | |||||
// Stub responses when requesting the vault API to simulate | |||||
// a task has been created | |||||
cy.route({ | |||||
method: 'POST', | |||||
url: this.vaultDirectoryUrl, | |||||
response: this.genVaultDirCookingResponse('new') | |||||
}).as('createVaultCookingTask'); | |||||
cy.route({ | |||||
method: 'GET', | |||||
url: this.vaultDirectoryUrl, | |||||
response: this.genVaultDirCookingResponse('new') | |||||
}).as('checkVaultCookingTask'); | |||||
// Create a vault cooking task through the GUI | |||||
createVaultCookingTask('Directory'); | |||||
cy.wait('@createVaultCookingTask'); | |||||
// Check that a redirection to the vault UI has been performed | |||||
cy.url().should('eq', Cypress.config().baseUrl + this.Urls.browse_vault()); | |||||
cy.wait('@checkVaultCookingTask').then(() => { | |||||
testProgressbar(this.directory, 'rgba(128, 128, 128, 0.5)', 'new'); | |||||
}); | |||||
// Stub response to the vault API indicating the task is processing | |||||
cy.route({ | |||||
method: 'GET', | |||||
url: this.vaultDirectoryUrl, | |||||
response: this.genVaultDirCookingResponse('pending', 'Processing...') | |||||
}).as('checkVaultCookingTask'); | |||||
cy.wait('@checkVaultCookingTask').then(() => { | |||||
testProgressbar(this.directory, 'rgba(0, 0, 255, 0.5)', 'Processing...'); | |||||
}); | |||||
// Stub response to the vault API indicating the task is finished | |||||
cy.route({ | |||||
method: 'GET', | |||||
url: this.vaultDirectoryUrl, | |||||
response: this.genVaultDirCookingResponse('done') | |||||
}).as('checkVaultCookingTask'); | |||||
cy.wait('@checkVaultCookingTask').then(() => { | |||||
testProgressbar(this.directory, 'rgb(92, 184, 92)', 'done'); | |||||
}); | |||||
// Stub response to the vault API indicating to simulate archive | |||||
// download | |||||
cy.route({ | |||||
method: 'GET', | |||||
url: this.vaultFetchDirectoryUrl, | |||||
response: `fx:${this.directory}.tar.gz,binary`, | |||||
headers: { | |||||
'Content-disposition': `attachment; filename=${this.directory}.tar.gz`, | |||||
'Content-Type': 'application/gzip' | |||||
} | |||||
}).as('fetchCookedArchive'); | |||||
cy.get(`#vault-task-${this.directory} .vault-dl-link button`) | |||||
.click(); | |||||
cy.wait('@fetchCookedArchive').then((xhr) => { | |||||
assert.isNotNull(xhr.response.body); | |||||
}); | |||||
Not Done Inline Actionsremove "indicating" vlorentz: remove "indicating" | |||||
}); | |||||
it('should create a revision cooking task and report its status', function() { | |||||
// Browse a revision | |||||
cy.visit(this.revisionUrl); | |||||
// Stub responses when requesting the vault API to simulate | |||||
// a task has been created | |||||
cy.route({ | |||||
method: 'POST', | |||||
url: this.vaultRevisionUrl, | |||||
response: this.genVaultRevCookingResponse('new') | |||||
}).as('createVaultCookingTask'); | |||||
cy.route({ | |||||
method: 'GET', | |||||
url: this.vaultRevisionUrl, | |||||
response: this.genVaultRevCookingResponse('new') | |||||
}).as('checkVaultCookingTask'); | |||||
// Create a vault cooking task through the GUI | |||||
createVaultCookingTask('Revision'); | |||||
cy.wait('@createVaultCookingTask'); | |||||
// Check that a redirection to the vault UI has been performed | |||||
cy.url().should('eq', Cypress.config().baseUrl + this.Urls.browse_vault()); | |||||
cy.wait('@checkVaultCookingTask').then(() => { | |||||
testProgressbar(this.revision, 'rgba(128, 128, 128, 0.5)', 'new'); | |||||
}); | |||||
// Stub response to the vault API indicating the task is processing | |||||
cy.route({ | |||||
method: 'GET', | |||||
url: this.vaultRevisionUrl, | |||||
response: this.genVaultRevCookingResponse('pending', 'Processing...') | |||||
}).as('checkVaultCookingTask'); | |||||
cy.wait('@checkVaultCookingTask').then(() => { | |||||
testProgressbar(this.revision, 'rgba(0, 0, 255, 0.5)', 'Processing...'); | |||||
}); | |||||
// Stub response to the vault API indicating the task is finished | |||||
cy.route({ | |||||
method: 'GET', | |||||
url: this.vaultRevisionUrl, | |||||
response: this.genVaultRevCookingResponse('done') | |||||
}).as('checkVaultCookingTask'); | |||||
cy.wait('@checkVaultCookingTask').then(() => { | |||||
testProgressbar(this.revision, 'rgb(92, 184, 92)', 'done'); | |||||
}); | |||||
// Stub response to the vault API indicating to simulate archive | |||||
// download | |||||
cy.route({ | |||||
method: 'GET', | |||||
url: this.vaultFetchRevisionUrl, | |||||
response: `fx:${this.revision}.gitfast.gz,binary`, | |||||
headers: { | |||||
'Content-disposition': `attachment; filename=${this.revision}.gitfast.gz`, | |||||
'Content-Type': 'application/gzip' | |||||
} | |||||
}).as('fetchCookedArchive'); | |||||
cy.get(`#vault-task-${this.revision} .vault-dl-link button`) | |||||
.click(); | |||||
cy.wait('@fetchCookedArchive').then((xhr) => { | |||||
assert.isNotNull(xhr.response.body); | |||||
}); | |||||
}); | |||||
it('should offer to recook an archive if no more available to download', function() { | |||||
cy.visit(this.Urls.browse_vault()) | |||||
.then(() => { | |||||
// Add uncooked task to localstorage | |||||
// that updates it in vault items list | |||||
window.localStorage.setItem('swh-vault-cooking-tasks', JSON.stringify(vaultItems)); | |||||
}); | |||||
// Send 404 for vault item | |||||
cy.route({ | |||||
method: 'GET', | |||||
status: 404, | |||||
url: this.vaultFetchRevisionUrl, | |||||
response: { | |||||
'exception': 'NotFoundExc', | |||||
'reason': "Revision with ID '49837799f6f29e63ec9315c80ed7677c206ae0f6' not found." | |||||
}, | |||||
headers: { | |||||
'Content-Type': 'json' | |||||
} | |||||
}).as('fetchCookedArchive'); | |||||
cy.get(`#vault-task-${this.revision} .vault-dl-link button`) | |||||
.click(); | |||||
cy.wait('@fetchCookedArchive').then(() => { | |||||
cy.route({ | |||||
method: 'POST', | |||||
url: this.vaultRevisionUrl, | |||||
response: this.genVaultRevCookingResponse('new') | |||||
}).as('createVaultCookingTask'); | |||||
cy.route({ | |||||
method: 'GET', | |||||
url: this.vaultRevisionUrl, | |||||
response: this.genVaultRevCookingResponse('new') | |||||
}).as('checkVaultCookingTask'); | |||||
cy.get('#vault-recook-object-modal') | |||||
.should('be.visible') | |||||
.contains('button:visible', 'Ok') | |||||
.click(); | |||||
cy.wait('@createVaultCookingTask') | |||||
.wait('@checkVaultCookingTask') | |||||
.then(() => { | |||||
testProgressbar(this.revision, 'rgba(128, 128, 128, 0.5)', 'new'); | |||||
}); | |||||
}); | |||||
}); | |||||
}); |
These should have a comment explaining they are used to mock an API endpoint (and the name of the endpoint)