//
// SPDX-License-Identifier: AGPL-3.0
+const path = require('path');
+
describe('Collection panel tests', function () {
let activeUser;
let adminUser;
+ let downloadsFolder;
before(function () {
// Only set up common users once. These aren't set up as aliases because
activeUser = this.activeUser;
}
);
+ downloadsFolder = Cypress.config('downloadsFolder');
});
beforeEach(function () {
cy.clearLocalStorage();
});
+ it('allows to download mountain duck config for a collection', () => {
+ cy.createCollection(adminUser.token, {
+ name: `Test collection ${Math.floor(Math.random() * 999999)}`,
+ owner_uuid: activeUser.user.uuid,
+ manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n"
+ })
+ .as('testCollection').then(function (testCollection) {
+ cy.loginAs(activeUser);
+ cy.goToPath(`/collections/${testCollection.uuid}`);
+
+ cy.get('[data-cy=collection-panel-options-btn]').click();
+ cy.get('[data-cy=context-menu]').contains('Open as network folder or S3 bucket').click();
+ cy.get('[data-cy=download-button').click();
+
+ const filename = path.join(downloadsFolder, `${testCollection.name}.duck`);
+
+ cy.readFile(filename, { timeout: 15000 })
+ .then((body) => {
+ const childrenCollection = Array.prototype.slice.call(Cypress.$(body).find('dict')[0].children);
+ const map = {};
+ let i, j = 2;
+
+ for (i=0; i < childrenCollection.length; i += j) {
+ map[childrenCollection[i].outerText] = childrenCollection[i + 1].outerText;
+ }
+
+ cy.get('#simple-tabpanel-0').find('a')
+ .then((a) => {
+ const [host, port] = a.text().split('@')[1].split('/')[0].split(':');
+ expect(map['Protocol']).to.equal('davs');
+ expect(map['UUID']).to.equal(testCollection.uuid);
+ expect(map['Username']).to.equal(activeUser.user.username);
+ expect(map['Port']).to.equal(port);
+ expect(map['Hostname']).to.equal(host);
+ if (map['Path']) {
+ expect(map['Path']).to.equal(`/c=${testCollection.uuid}`);
+ }
+ });
+ })
+ .then(() => cy.task('clearDownload', { filename }));
+ });
+ });
+
it('uses the property editor with vocabulary terms', function () {
cy.createCollection(adminUser.token, {
name: `Test collection ${Math.floor(Math.random() * 999999)}`,
})
.as('testCollection').then(function () {
cy.loginAs(activeUser);
- cy.doSearch(`${this.testCollection.uuid}`);
+ cy.goToPath(`/collections/${this.testCollection.uuid}`);
// Key: Color (IDTAGCOLORS) - Value: Magenta (IDVALCOLORS3)
cy.get('[data-cy=resource-properties-form]').within(() => {
// on this loop may pass an assertion from the first iteration by looking
// for the same file name.
const fileName = isWritable ? 'bar' : 'foo';
+ const subDirName = 'subdir';
cy.createGroup(adminUser.token, {
name: 'Shared project',
group_class: 'project',
name: 'Test collection',
owner_uuid: this.sharedGroup.uuid,
properties: { someKey: 'someValue' },
- manifest_text: `. 37b51d194a7513e45b56f6524f2d51f2+3 0:3:${fileName}\n`
+ manifest_text: `. 37b51d194a7513e45b56f6524f2d51f2+3 0:3:${fileName}\n./${subDirName} 37b51d194a7513e45b56f6524f2d51f2+3 0:3:${fileName}\n`
})
.as('testCollection').then(function () {
// Share the group with active user.
head_uuid: this.sharedGroup.uuid,
tail_uuid: activeUser.user.uuid
})
- cy.doSearch(`${this.testCollection.uuid}`);
+ cy.goToPath(`/collections/${this.testCollection.uuid}`);
// Check that name & uuid are correct.
cy.get('[data-cy=collection-info-panel]')
.should(`${isWritable ? '' : 'not.'}contain`, 'Upload data');
}
});
+ // Test context menus
cy.get('[data-cy=collection-files-panel]')
.contains(fileName).rightclick({ force: true });
cy.get('[data-cy=context-menu]')
.and(`${isWritable ? '' : 'not.'}contain`, 'Rename')
.and(`${isWritable ? '' : 'not.'}contain`, 'Remove');
cy.get('body').click(); // Collapse the menu
+ cy.get('[data-cy=collection-files-panel]')
+ .contains(subDirName).rightclick({ force: true });
+ cy.get('[data-cy=context-menu]')
+ .should('not.contain', 'Download')
+ .and('contain', 'Open in new tab')
+ .and('contain', 'Copy to clipboard')
+ .and(`${isWritable ? '' : 'not.'}contain`, 'Rename')
+ .and(`${isWritable ? '' : 'not.'}contain`, 'Remove');
+ cy.get('body').click(); // Collapse the menu
// Hamburger 'more options' menu button
cy.get('[data-cy=collection-files-panel-options-btn]')
.click()
cy.get('[data-cy=collection-files-panel-options-btn]')
.click()
cy.get('[data-cy=context-menu]')
- // .should('contain', 'Download selected')
.should(`${isWritable ? '' : 'not.'}contain`, 'Remove selected')
cy.get('body').click(); // Collapse the menu
- // File item 'more options' button
- cy.get('[data-cy=file-item-options-btn')
- .click()
- cy.get('[data-cy=context-menu]')
- .should('contain', 'Download')
- .and(`${isWritable ? '' : 'not.'}contain`, 'Remove');
- cy.get('body').click(); // Collapse the menu
})
})
})
})
it('renames a file using valid names', function () {
+ function eachPair(lst, func){
+ for(var i=0; i < lst.length - 1; i++){
+ func(lst[i], lst[i + 1])
+ }
+ }
// Creates the collection using the admin token so we can set up
// a bogus manifest text without block signatures.
cy.createCollection(adminUser.token, {
})
.as('testCollection').then(function () {
cy.loginAs(activeUser);
- cy.doSearch(`${this.testCollection.uuid}`);
-
- const nameTransitions = [
- ['bar', '&'],
- ['&', 'foo'],
- ['foo', '&'],
- ['&', 'I ❤️ ⛵️'],
- ['I ❤️ ⛵️', '...'],
- ['...', , '#...'],
- ['#...', 'some name with whitespaces'],
- ['some name with whitespaces', 'some name with whitespaces #2'],
- ['some name with whitespaces #2', 'is this name legal? I hope it is'],
- ['is this name legal? I hope it is', 'some_file.pdf#'],
- ['some_file.pdf#', 'some_file.pdf?'],
- ['some_file.pdf?', '?some_file.pdf']
+ cy.goToPath(`/collections/${this.testCollection.uuid}`);
+
+ const names = [
+ 'bar', // initial name already set
+ '&',
+ 'foo',
+ '&',
+ 'I ❤️ ⛵️',
+ '...',
+ '#..',
+ 'some name with whitespaces',
+ 'some name with #2',
+ 'is this name legal? I hope it is',
+ 'some_file.pdf#',
+ 'some_file.pdf?',
+ '?some_file.pdf',
+ 'some%file.pdf',
+ 'some%2Ffile.pdf',
+ 'some%22file.pdf',
+ 'some%20file.pdf',
+ "G%C3%BCnter's%20file.pdf",
+ 'table%&?*2',
+ 'bar' // make sure we can go back to the original name as a last step
];
- nameTransitions.forEach(([from, to]) => {
+ eachPair(names, (from, to) => {
cy.get('[data-cy=collection-files-panel]')
.contains(`${from}`).rightclick();
cy.get('[data-cy=context-menu]')
})
.as('testCollection').then(function () {
cy.loginAs(activeUser);
- cy.doSearch(`${this.testCollection.uuid}`);
+ cy.goToPath(`/collections/${this.testCollection.uuid}`);
- // Rename 'bar' to 'subdir/foo'
- cy.get('[data-cy=collection-files-panel]')
- .contains('bar').rightclick();
- cy.get('[data-cy=context-menu]')
- .contains('Rename')
- .click();
- cy.get('[data-cy=form-dialog]')
- .should('contain', 'Rename')
- .within(() => {
- cy.get('input').type(`{selectall}{backspace}subdir/foo`);
- });
- cy.get('[data-cy=form-submit-btn]').click();
- cy.get('[data-cy=collection-files-panel]')
- .should('not.contain', 'bar')
- .and('contain', 'subdir');
- // Look for the "arrow icon" and expand the "subdir" directory.
- cy.get('[data-cy=virtual-file-tree] > div > i').click();
- // Rename 'subdir/foo' to 'baz'
- cy.get('[data-cy=collection-files-panel]')
- .contains('foo').rightclick();
- cy.get('[data-cy=context-menu]')
- .contains('Rename')
- .click();
- cy.get('[data-cy=form-dialog]')
- .should('contain', 'Rename')
- .within(() => {
- cy.get('input')
- .should('have.value', 'subdir/foo')
- .type(`{selectall}{backspace}baz`);
- });
- cy.get('[data-cy=form-submit-btn]').click();
- cy.get('[data-cy=collection-files-panel]')
- .should('contain', 'subdir') // empty dir kept
- .and('contain', 'baz');
+ ['subdir', 'G%C3%BCnter\'s%20file', 'table%&?*2'].forEach((subdir) => {
+ cy.get('[data-cy=collection-files-panel]')
+ .contains('bar').rightclick({force: true});
+ cy.get('[data-cy=context-menu]')
+ .contains('Rename')
+ .click();
+ cy.get('[data-cy=form-dialog]')
+ .should('contain', 'Rename')
+ .within(() => {
+ cy.get('input').type(`{selectall}{backspace}${subdir}/foo`);
+ });
+ cy.get('[data-cy=form-submit-btn]').click();
+ cy.get('[data-cy=collection-files-panel]')
+ .should('not.contain', 'bar')
+ .and('contain', subdir);
+ // Look for the "arrow icon" and expand the "subdir" directory.
+ cy.get('[data-cy=virtual-file-tree] > div > i').click();
+ // Rename 'subdir/foo' to 'foo'
+ cy.get('[data-cy=collection-files-panel]')
+ .contains('foo').rightclick();
+ cy.get('[data-cy=context-menu]')
+ .contains('Rename')
+ .click();
+ cy.get('[data-cy=form-dialog]')
+ .should('contain', 'Rename')
+ .within(() => {
+ cy.get('input')
+ .should('have.value', `${subdir}/foo`)
+ .type(`{selectall}{backspace}bar`);
+ });
+ cy.get('[data-cy=form-submit-btn]').click();
+ cy.get('[data-cy=collection-files-panel]')
+ .should('contain', subdir) // empty dir kept
+ .and('contain', 'bar');
+
+ cy.get('[data-cy=collection-files-panel]')
+ .contains(subdir).rightclick();
+ cy.get('[data-cy=context-menu]')
+ .contains('Remove')
+ .click();
+ cy.get('[data-cy=confirmation-dialog-ok-btn]').click();
+ });
});
});
})
.as('testCollection').then(function () {
cy.loginAs(activeUser);
- cy.doSearch(`${this.testCollection.uuid}`);
+ cy.goToPath(`/collections/${this.testCollection.uuid}`);
const illegalNamesFromUI = [
['.', "Name cannot be '.' or '..'"],
});
// Check the old version displays as what it is.
cy.loginAs(activeUser)
- cy.doSearch(`${oldVersionUuid}`);
+ cy.goToPath(`/collections/${oldVersionUuid}`);
cy.get('[data-cy=collection-info-panel]').should('contain', 'This is an old version');
cy.get('[data-cy=read-only-icon]').should('exist');
});
});
- it('should display all filles within the collection even with the # sign within the file name', () => {
- const colName = `Test Collection ${Math.floor(Math.random() * 999999)}`;
-
- cy.createCollection(adminUser.token, {
- name: colName,
- owner_uuid: activeUser.user.uuid,
- preserve_version: true,
- manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:#foo 0:3:bar\n"
- })
- .as('collection')
- .then((collection) => {
- cy.loginAs(activeUser)
- cy.doSearch(`${collection.uuid}`);
- cy.get('[data-cy=collection-files-panel]').contains('#foo').closest('[data-cy=virtual-file-tree]').find('[type=checkbox]').click();
- cy.get('[data-cy=collection-files-panel-options-btn]').click();
- cy.get('[data-cy=context-menu]').contains('Remove selected').click();
- cy.get('[data-cy=confirmation-dialog-ok-btn]').click();
- cy.get('[data-cy=collection-files-panel]').contains('#foo').should('not.exist');
-
- cy.get('[data-cy=collection-files-panel]').contains('bar').rightclick();
- cy.get('[data-cy=context-menu]').contains('Rename').click();
- cy.get('input[name=path]').type('bar 123 321 bar');
- cy.get('[data-cy=form-submit-btn]').click();
- cy.get('[data-cy=collection-files-panel]').contains('barbar 123 321 bar').should('exist');
- });
- });
-
it('uses the collection version browser to view a previous version', function () {
const colName = `Test Collection ${Math.floor(Math.random() * 999999)}`;
.as('collection').then(function () {
// Visit collection, check basic information
cy.loginAs(activeUser)
- cy.doSearch(`${this.collection.uuid}`);
+ cy.goToPath(`/collections/${this.collection.uuid}`);
cy.get('[data-cy=collection-info-panel]').should('not.contain', 'This is an old version');
cy.get('[data-cy=read-only-icon]').should('not.exist');
it('creates new collection on home project', function () {
cy.loginAs(activeUser);
- cy.doSearch(`${activeUser.user.uuid}`);
+ cy.goToPath(`/projects/${activeUser.user.uuid}`);
cy.get('[data-cy=breadcrumb-first]').should('contain', 'Projects');
cy.get('[data-cy=breadcrumb-last]').should('not.exist');
// Create new collection