Page MenuHomeSoftware Heritage

vault.spec.js
No OneTemporary

vault.spec.js

/**
* 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
*/
let vaultItems = [];
const progressbarColors = {
'new': 'rgba(128, 128, 128, 0.5)',
'pending': 'rgba(0, 0, 255, 0.5)',
'done': 'rgb(92, 184, 92)'
};
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();
}
// Mocks API response : /api/1/vault/(:objectType)/(:hash)
// objectType : {'directory', 'revision'}
function genVaultCookingResponse(objectType, objectId, status, message, fetchUrl) {
return {
'obj_type': objectType,
'id': 1,
'progress_message': message,
'status': status,
'obj_id': objectId,
'fetch_url': fetchUrl
};
};
// Tests progressbar color, status
// And status in localStorage
function testStatus(taskId, color, statusMsg, status) {
cy.get(`.swh-vault-table #vault-task-${taskId}`)
.should('be.visible')
.find('.progress-bar')
.should('be.visible')
.and('have.css', 'background-color', color)
.and('contain', statusMsg)
.then(() => {
// Vault item with object_id as taskId should exist in localStorage
const currentVaultItems = JSON.parse(window.localStorage.getItem('swh-vault-cooking-tasks'));
const vaultItem = currentVaultItems.find(obj => obj.object_id === taskId);
assert.isNotNull(vaultItem);
assert.strictEqual(vaultItem.status, 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].revisions[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);
};
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(() => {
testStatus(this.directory, progressbarColors['new'], 'new', '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(() => {
testStatus(this.directory, progressbarColors['pending'], 'Processing...', 'pending');
});
// 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(() => {
testStatus(this.directory, progressbarColors['done'], 'done', 'done');
});
// Stub response to the vault API 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);
});
});
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(() => {
testStatus(this.revision, progressbarColors['new'], 'new', '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(() => {
testStatus(this.revision, progressbarColors['pending'], 'Processing...', 'pending');
});
// 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(() => {
testStatus(this.revision, progressbarColors['done'], 'done', '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
// which updates it in vault items list
window.localStorage.setItem('swh-vault-cooking-tasks', JSON.stringify(vaultItems));
});
// Send 404 when fetching vault item
cy.route({
method: 'GET',
status: 404,
url: this.vaultFetchRevisionUrl,
response: {
'exception': 'NotFoundExc',
'reason': `Revision with ID '${this.revision}' 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 > .modal-dialog')
.should('be.visible')
.contains('button:visible', 'Ok')
.click();
cy.wait('@createVaultCookingTask')
.wait('@checkVaultCookingTask')
.then(() => {
testStatus(this.revision, progressbarColors['new'], 'new', 'new');
});
});
});
});

File Metadata

Mime Type
text/plain
Expires
Thu, Jul 3, 11:34 AM (6 d, 5 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3351602

Event Timeline