it('shows collection by URL', function() {
cy.loginAs(activeUser);
[true, false].map(function(isWritable) {
- // Creates the collection using the admin token so we can set up
- // a bogus manifest text without block signatures.
- cy.createCollection(adminUser.token, {
- name: 'Test collection',
- owner_uuid: isWritable
- ? activeUser.user.uuid
- : adminUser.user.uuid,
- properties: {someKey: 'someValue'},
- manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n"})
- .as('testCollection').then(function() {
- if (isWritable === false) {
- // Share collection as read-only
- cy.do_request('POST', '/arvados/v1/links', {
- link: JSON.stringify({
- name: 'can_read',
- link_class: 'permission',
- head_uuid: this.testCollection.uuid,
- tail_uuid: activeUser.user.uuid
- })
- }, null, adminUser.token, null);
- }
- cy.visit(`/collections/${this.testCollection.uuid}`);
- // Check that name & uuid are correct.
- cy.get('[data-cy=collection-info-panel]')
- .should('contain', this.testCollection.name)
- .and(`${isWritable ? 'not.': ''}contain`, 'Read-only')
- .and('contain', this.testCollection.uuid);
- // Check that both read and write operations are available on
- // the 'More options' menu.
- cy.get('[data-cy=collection-panel-options-btn]')
- .click()
- cy.get('[data-cy=context-menu]')
- .should('contain', 'Add to favorites')
- .and(`${isWritable ? '' : 'not.'}contain`, 'Edit collection')
- .type('{esc}'); // Collapse the options menu
- cy.get('[data-cy=collection-properties-panel]')
- .should('contain', 'someKey')
- .and('contain', 'someValue')
- .and('not.contain', 'anotherKey')
- .and('not.contain', 'anotherValue')
- // Check that properties can be added.
- if (isWritable === true) {
- cy.get('[data-cy=collection-properties-form]').within(() => {
- cy.get('[data-cy=property-field-key]').within(() => {
- cy.get('input').type('anotherKey');
- });
- cy.get('[data-cy=property-field-value]').within(() => {
- cy.get('input').type('anotherValue');
- });
- cy.root().submit();
+ cy.createGroup(adminUser.token, {
+ name: 'Shared project',
+ group_class: 'project',
+ }).as('sharedGroup').then(function() {
+ // Creates the collection using the admin token so we can set up
+ // a bogus manifest text without block signatures.
+ cy.createCollection(adminUser.token, {
+ name: 'Test collection',
+ owner_uuid: this.sharedGroup.uuid,
+ properties: {someKey: 'someValue'},
+ manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n"})
+ .as('testCollection').then(function() {
+ // Share the group with active user.
+ cy.createLink(adminUser.token, {
+ name: isWritable ? 'can_write' : 'can_read',
+ link_class: 'permission',
+ head_uuid: this.sharedGroup.uuid,
+ tail_uuid: activeUser.user.uuid
})
+ cy.visit(`/collections/${this.testCollection.uuid}`);
+ // Check that name & uuid are correct.
+ cy.get('[data-cy=collection-info-panel]')
+ .should('contain', this.testCollection.name)
+ .and(`${isWritable ? 'not.': ''}contain`, 'Read-only')
+ .and('contain', this.testCollection.uuid);
+ // Check that both read and write operations are available on
+ // the 'More options' menu.
+ cy.get('[data-cy=collection-panel-options-btn]')
+ .click()
+ cy.get('[data-cy=context-menu]')
+ .should('contain', 'Add to favorites')
+ .and(`${isWritable ? '' : 'not.'}contain`, 'Edit collection')
+ .type('{esc}'); // Collapse the options menu
cy.get('[data-cy=collection-properties-panel]')
- .should('contain', 'anotherKey')
- .and('contain', 'anotherValue')
- }
- // Check that the file listing show both read & write operations
- cy.get('[data-cy=collection-files-panel]').within(() => {
- cy.root().should('contain', 'bar');
- cy.get('[data-cy=upload-button]')
- .should(`${isWritable ? '' : 'not.'}contain`, 'Upload data');
- });
- // Hamburger 'more options' menu button
- cy.get('[data-cy=collection-files-panel-options-btn]')
- .click()
- cy.get('[data-cy=context-menu]')
- .should('contain', 'Select all')
- .click()
- cy.get('[data-cy=collection-files-panel-options-btn]')
- .click()
- cy.get('[data-cy=context-menu]')
- .should('contain', 'Download selected')
- .and(`${isWritable ? '' : 'not.'}contain`, 'Remove selected')
- .type('{esc}'); // Collapse the options 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')
- .type('{esc}'); // Collapse
+ .should('contain', 'someKey')
+ .and('contain', 'someValue')
+ .and('not.contain', 'anotherKey')
+ .and('not.contain', 'anotherValue')
+ if (isWritable === true) {
+ // Check that properties can be added.
+ cy.get('[data-cy=collection-properties-form]').within(() => {
+ cy.get('[data-cy=property-field-key]').within(() => {
+ cy.get('input').type('anotherKey');
+ });
+ cy.get('[data-cy=property-field-value]').within(() => {
+ cy.get('input').type('anotherValue');
+ });
+ cy.root().submit();
+ })
+ cy.get('[data-cy=collection-properties-panel]')
+ .should('contain', 'anotherKey')
+ .and('contain', 'anotherValue')
+ } else {
+ // Properties form shouldn't be displayed.
+ cy.get('[data-cy=collection-properties-form]').should('not.exist');
+ }
+ // Check that the file listing show both read & write operations
+ cy.get('[data-cy=collection-files-panel]').within(() => {
+ cy.root().should('contain', 'bar');
+ cy.get('[data-cy=upload-button]')
+ .should(`${isWritable ? '' : 'not.'}contain`, 'Upload data');
+ });
+ // Hamburger 'more options' menu button
+ cy.get('[data-cy=collection-files-panel-options-btn]')
+ .click()
+ cy.get('[data-cy=context-menu]')
+ .should('contain', 'Select all')
+ .click()
+ cy.get('[data-cy=collection-files-panel-options-btn]')
+ .click()
+ cy.get('[data-cy=context-menu]')
+ .should('contain', 'Download selected')
+ .and(`${isWritable ? '' : 'not.'}contain`, 'Remove selected')
+ .type('{esc}'); // Collapse the options 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')
+ .type('{esc}'); // Collapse
+ })
})
})
})
const systemToken = Cypress.env('system_token');
Cypress.Commands.add(
- "do_request", (method='GET', path='', data=null, qs=null,
+ "doRequest", (method='GET', path='', data=null, qs=null,
token=systemToken, auth=false, followRedirect=true) => {
return cy.request({
method: method,
Cypress.Commands.add(
"getUser", (username, first_name='', last_name='', is_admin=false, is_active=true) => {
// Create user if not already created
- return cy.do_request('POST', '/auth/controller/callback', {
+ return cy.doRequest('POST', '/auth/controller/callback', {
auth_info: JSON.stringify({
email: `${username}@example.local`,
username: username,
.then(function() {
this.userToken = this.location.split("=")[1]
assert.isString(this.userToken)
- return cy.do_request('GET', '/arvados/v1/users', null, {
+ return cy.doRequest('GET', '/arvados/v1/users', null, {
filters: `[["username", "=", "${username}"]]`
})
.its('body.items.0')
.as('aUser')
.then(function() {
- cy.do_request('PUT', `/arvados/v1/users/${this.aUser.uuid}`, {
+ cy.doRequest('PUT', `/arvados/v1/users/${this.aUser.uuid}`, {
user: {
is_admin: is_admin,
is_active: is_active
)
Cypress.Commands.add(
- "createCollection", (token, collection) => {
- return cy.do_request('POST', '/arvados/v1/collections', {
- collection: JSON.stringify(collection),
+ "createLink", (token, data) => {
+ return cy.createResource(token, 'links', {
+ link: JSON.stringify(data)
+ })
+ }
+)
+
+Cypress.Commands.add(
+ "createGroup", (token, data) => {
+ return cy.createResource(token, 'groups', {
+ group: JSON.stringify(data),
+ ensure_unique_name: true
+ })
+ }
+)
+
+Cypress.Commands.add(
+ "createCollection", (token, data) => {
+ return cy.createResource(token, 'collections', {
+ collection: JSON.stringify(data),
ensure_unique_name: true
- }, null, token, true)
- .its('body').as('collection')
+ })
+ }
+)
+
+Cypress.Commands.add(
+ "createResource", (token, suffix, data) => {
+ return cy.doRequest('POST', '/arvados/v1/'+suffix, data, null, token, true)
+ .its('body').as('resource')
.then(function() {
- return this.collection;
+ return this.resource;
})
}
)