Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion REUSE.toml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ SPDX-FileCopyrightText = "2017 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"

[[annotations]]
path = ["cypress/styleguide/assets/img/filetypes/font.svg", "cypress/styleguide/assets/img/actions/star-rounded.svg", "cypress/fixtures/example.json", "cypress/fixtures/NC_server_test.pdf", "cypress/fixtures/photo-test-1.jpeg", "cypress/fixtures/test-import.csv", "playwright/fixtures/example.json", "playwright/fixtures/NC_server_test.pdf", "playwright/fixtures/photo-test-1.jpeg", "playwright/fixtures/test-import.csv", "docs/permissions-matrix.xlsx", "tests/stub.phpstub", "tests/integration/composer.json", "tests/integration/composer.lock", "tests/integration/base-query-count.txt"]
path = ["cypress/styleguide/assets/img/filetypes/font.svg", "cypress/styleguide/assets/img/actions/star-rounded.svg", "cypress/fixtures/example.json", "cypress/fixtures/NC_server_test.pdf", "cypress/fixtures/photo-test-1.jpeg", "cypress/fixtures/test-import-large.csv", "cypress/fixtures/test-import-small.csv", "playwright/fixtures/example.json", "playwright/fixtures/NC_server_test.pdf", "playwright/fixtures/photo-test-1.jpeg", "playwright/fixtures/test-import.csv", "docs/permissions-matrix.xlsx", "tests/stub.phpstub", "tests/integration/composer.json", "tests/integration/composer.lock", "tests/integration/base-query-count.txt"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2023 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"
Expand Down
11 changes: 8 additions & 3 deletions appinfo/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,18 @@

// import
['name' => 'import#previewImportTable', 'url' => '/import-preview/table/{tableId}', 'verb' => 'POST'],
['name' => 'import#importInTable', 'url' => '/import/table/{tableId}', 'verb' => 'POST'],
['name' => 'import#importV2InTable', 'url' => '/v2/import/table/{tableId}', 'verb' => 'POST'],
['name' => 'import#importV2InView', 'url' => '/v2/import/view/{viewId}', 'verb' => 'POST'],
['name' => 'import#previewImportView', 'url' => '/import-preview/view/{viewId}', 'verb' => 'POST'],
['name' => 'import#importInView', 'url' => '/import/view/{viewId}', 'verb' => 'POST'],
['name' => 'import#previewUploadImportTable', 'url' => '/importupload-preview/table/{tableId}', 'verb' => 'POST'],
['name' => 'import#importUploadInTable', 'url' => '/importupload/table/{tableId}', 'verb' => 'POST'],
['name' => 'import#previewUploadImportView', 'url' => '/importupload-preview/view/{viewId}', 'verb' => 'POST'],
['name' => 'import#importV2UploadInTable', 'url' => '/v2/importupload/table/{tableId}', 'verb' => 'POST'],
['name' => 'import#importV2UploadInView', 'url' => '/v2/importupload/view/{viewId}', 'verb' => 'POST'],
// deprecated endpoints
['name' => 'import#importUploadInTable', 'url' => '/importupload/table/{tableId}', 'verb' => 'POST'],
['name' => 'import#importUploadInView', 'url' => '/importupload/view/{viewId}', 'verb' => 'POST'],
['name' => 'import#importInTable', 'url' => '/import/table/{tableId}', 'verb' => 'POST'],
['name' => 'import#importInView', 'url' => '/import/view/{viewId}', 'verb' => 'POST'],

// search
['name' => 'search#all', 'url' => '/search/all', 'verb' => 'GET'],
Expand Down
89 changes: 68 additions & 21 deletions cypress/e2e/tables-import.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ describe('Import csv', () => {
cy.createRandomUser().then(user => {
localUser = user
cy.login(localUser)
cy.uploadFile('test-import.csv', 'text/csv')
cy.uploadFile('test-import-small.csv', 'text/csv')
cy.uploadFile('test-import-large.csv', 'text/csv')
})
})

Expand All @@ -19,11 +20,11 @@ describe('Import csv', () => {
cy.visit('apps/tables')
})

it('Import csv from Files', () => {
it('Import small csv from Files', () => {
cy.loadTable('Welcome to Nextcloud Tables!')
cy.clickOnTableThreeDotMenu('Import')
cy.get('.modal__content button').contains('Select from Files').click()
cy.get('.file-picker__files').contains('test-import').click()
cy.get('.file-picker__files').contains('test-import-small').click()
cy.get('.file-picker button span').contains('Import').click()
cy.get('.modal__content .import-filename', { timeout: 5000 }).should('be.visible')

Expand All @@ -32,7 +33,7 @@ describe('Import csv', () => {
cy.wait('@importPreviewPath')
cy.get('.file_import__preview tbody tr', { timeout: 20000 }).should('have.length', 4)

cy.intercept({ method: 'POST', url: '**/apps/tables/import/table/*' }).as('importUploadReq')
cy.intercept({ method: 'POST', url: '**/apps/tables/v2/import/table/*' }).as('importUploadReq')
cy.get('.modal__content button').contains('Import').click()
cy.wait('@importUploadReq')
cy.get('[data-cy="importResultColumnsFound"]').should('contain.text', '4')
Expand All @@ -43,18 +44,36 @@ describe('Import csv', () => {
cy.get('[data-cy="importResultRowErrors"]').should('contain.text', '0')
})

it('Import csv from device', () => {
it('Import large csv from Files', () => {
cy.loadTable('Welcome to Nextcloud Tables!')
cy.clickOnTableThreeDotMenu('Import')
cy.get('.modal__content button').contains('Select from Files').click()
cy.get('.file-picker__files').contains('test-import-large').click()
cy.get('.file-picker button span').contains('Import').click()
cy.get('.modal__content .import-filename', { timeout: 5000 }).should('be.visible')

cy.intercept({ method: 'POST', url: '**/apps/tables/import-preview/**' }).as('importPreviewPath')
cy.get('.modal__content button').contains('Preview').click()
cy.wait('@importPreviewPath')
cy.get('.file_import__preview tbody tr', { timeout: 20000 }).should('have.length', 4)

cy.intercept({ method: 'POST', url: '**/apps/tables/v2/import/table/*' }).as('importUploadReq')
cy.get('.modal__content button').contains('Import').click()
cy.wait('@importUploadReq').its('response.statusCode').should('equal', 200)
})

it('Import small csv from device', () => {
cy.loadTable('Welcome to Nextcloud Tables!')
cy.clickOnTableThreeDotMenu('Import')
cy.get('.modal__content button').contains('Upload from device').click()
cy.get('input[type="file"]').selectFile('cypress/fixtures/test-import.csv', { force: true })
cy.get('input[type="file"]').selectFile('cypress/fixtures/test-import-small.csv', { force: true })

cy.intercept({ method: 'POST', url: '**/apps/tables/importupload-preview/**' }).as('importPreviewUpload')
cy.get('.modal__content button').contains('Preview').click()
cy.wait('@importPreviewUpload')
cy.get('.file_import__preview tbody tr', { timeout: 20000 }).should('have.length', 4)

cy.intercept({ method: 'POST', url: '**/apps/tables/importupload/table/*' }).as('importUploadReq')
cy.intercept({ method: 'POST', url: '**/apps/tables/v2/importupload/table/*' }).as('importUploadReq')
cy.get('.modal__content button').contains('Import').click()
cy.wait('@importUploadReq')
cy.get('[data-cy="importResultColumnsFound"]', { timeout: 20000 }).should('contain.text', '4')
Expand All @@ -65,6 +84,22 @@ describe('Import csv', () => {
cy.get('[data-cy="importResultRowErrors"]').should('contain.text', '0')
})

it('Import large csv from device', () => {
cy.loadTable('Welcome to Nextcloud Tables!')
cy.clickOnTableThreeDotMenu('Import')
cy.get('.modal__content button').contains('Upload from device').click()
cy.get('input[type="file"]').selectFile('cypress/fixtures/test-import-large.csv', { force: true })

cy.intercept({ method: 'POST', url: '**/apps/tables/importupload-preview/**' }).as('importPreviewUpload')
cy.get('.modal__content button').contains('Preview').click()
cy.wait('@importPreviewUpload')
cy.get('.file_import__preview tbody tr', { timeout: 20000 }).should('have.length', 4)

cy.intercept({ method: 'POST', url: '**/apps/tables/v2/importupload/table/*' }).as('importUploadReq')
cy.get('.modal__content button').contains('Import').click()
cy.wait('@importUploadReq').its('response.statusCode').should('equal', 200)
})

it('Import csv from device with updating of existent files', () => {
cy.intercept({ method: 'GET', url: '**/apps/tables/row/table/*' }).as('rowsReq')

Expand All @@ -89,7 +124,7 @@ describe('Import csv', () => {
cy.wait('@importPreviewUpdate')
cy.get('.file_import__preview tbody tr', { timeout: 20000 }).should('have.length', 3)

cy.intercept({ method: 'POST', url: '**/apps/tables/importupload/table/*' }).as('importUploadReq')
cy.intercept({ method: 'POST', url: '**/apps/tables/v2/importupload/table/*' }).as('importUploadReq')
cy.get('.modal__content button').contains('Import').click()
cy.wait('@importUploadReq')
cy.get('[data-cy="importResultColumnsFound"]', { timeout: 20000 }).should('contain.text', '2')
Expand All @@ -104,10 +139,9 @@ describe('Import csv', () => {
})

describe('Import csv from Files file action', () => {
const rowActionsButton = '[data-cy-files-list-row-name="test-import.csv"] [data-cy-files-list-row-actions] .action-item button'
const importToTablesAction = '[data-cy-files-list-row-action="import-to-tables"]'

const openImportToTablesAction = (retries = 8) => {
const openImportToTablesAction = (file, retries = 8) => {
const rowActionsButton = `[data-cy-files-list-row-name="${file}"] [data-cy-files-list-row-actions] .action-item button`
cy.get(rowActionsButton).click()
cy.get('body').then($body => {
if ($body.find(importToTablesAction).length > 0) {
Expand All @@ -116,35 +150,37 @@ describe('Import csv from Files file action', () => {
}

if (retries <= 0) {
throw new Error('Import to Tables action did not become available in file actions menu')
throw new Error(`Import to Tables action did not become available in file actions menu for file: ${file}`)
}

cy.get('body').click(0, 0)
cy.wait(1000)
openImportToTablesAction(retries - 1)
openImportToTablesAction(file, retries - 1)
})
}

before(function() {
cy.createRandomUser().then(user => {
localUser = user
cy.login(localUser)
cy.uploadFile('test-import.csv', 'text/csv')
cy.uploadFile('test-import-small.csv', 'text/csv')
cy.uploadFile('test-import-large.csv', 'text/csv')
})
})

beforeEach(function() {
cy.login(localUser)
cy.visit('apps/files/files', { timeout: 120000 })
cy.get('[data-cy-files-list-row-name="test-import.csv"]', { timeout: 120000 }).should('be.visible')
cy.get('[data-cy-files-list-row-name="test-import-small.csv"]', { timeout: 120000 }).should('be.visible')
cy.get('[data-cy-files-list-row-name="test-import-large.csv"]', { timeout: 120000 }).should('be.visible')
})

it('Import to new table', () => {
openImportToTablesAction()
it('Import small file to new table', () => {
openImportToTablesAction('test-import-small.csv')

cy.intercept({
method: 'POST',
url: '**/apps/tables/import/table/*',
url: '**/apps/tables/v2/import/table/*',
}).as('importNewTableReq')
cy.get('[data-cy="fileActionImportButton"]').click({ force: true })
cy.wait('@importNewTableReq').its('response.statusCode').should('equal', 200)
Expand All @@ -157,16 +193,27 @@ describe('Import csv from Files file action', () => {
cy.get('[data-cy="importResultRowErrors"]').should('contain.text', '0')
})

it('Import to existing table', () => {
openImportToTablesAction()
it('Import large file to new table', () => {
openImportToTablesAction('test-import-large.csv')

cy.intercept({
method: 'POST',
url: '**/apps/tables/v2/import/table/*',
}).as('importNewTableReq')
cy.get('[data-cy="fileActionImportButton"]').click({ force: true })
cy.wait('@importNewTableReq').its('response.statusCode').should('equal', 200)
})

it('Import small file to existing table', () => {
openImportToTablesAction('test-import-small.csv')

cy.get('.modal__content [data-cy="importAsNewTableSwitch"] input').uncheck({ force: true })
cy.get('[data-cy="selectExistingTableDropdown"]').type('Welcome to Nextcloud Tables!')
cy.get('.name-parts').click()

cy.intercept({
method: 'POST',
url: '**/apps/tables/import/table/*',
url: '**/apps/tables/v2/import/table/*',
}).as('importExistingTableReq')
cy.get('[data-cy="fileActionImportButton"]').click({ force: true })
cy.wait('@importExistingTableReq').its('response.statusCode').should('equal', 200)
Expand Down
6 changes: 3 additions & 3 deletions cypress/e2e/tables-table.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ describe('Manage a table', () => {
})

it('Create with import', () => {
cy.uploadFile('test-import.csv', 'text/csv')
cy.uploadFile('test-import-small.csv', 'text/csv')
cy.get('.icon-loading').should('not.exist')
cy.get('[data-cy="navigationCreateTableIcon"]').click({ force: true })
// should type before selecting the table type tile
Expand All @@ -47,11 +47,11 @@ describe('Manage a table', () => {
cy.contains('h2', 'Import').should('be.visible')

cy.get('.modal__content button').contains('Select from Files').click()
cy.get('.file-picker__files').contains('test-import').click()
cy.get('.file-picker__files').contains('test-import-small').click()
cy.get('.file-picker button span').contains('Import').click()
cy.get('.modal__content button').contains('Preview').click()
cy.get('.file_import__preview tbody tr').should('have.length', 4)
cy.intercept({ method: 'POST', url: '**/apps/tables/import/table/*' }).as('importUploadReq')
cy.intercept({ method: 'POST', url: '**/apps/tables/v2/import/table/*' }).as('importUploadReq')
cy.get('.modal__content button').contains('Import').scrollIntoView().click()
cy.wait('@importUploadReq')
cy.get('[data-cy="importResultColumnsFound"]').should('contain.text', '4')
Expand Down
Loading
Loading