diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5aed690b..08796606 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -158,9 +158,9 @@ jobs: DJANGO_SU_PASSWORD: '12qwaszx' API_ABOUT_PAGE: "localhost:8080/api/v1/server/about" run: | - docker-compose -f docker-compose.yml -f docker-compose.dev.yml -f components/serverless/docker-compose.serverless.yml up -d + docker-compose -f docker-compose.yml -f docker-compose.dev.yml -f components/serverless/docker-compose.serverless.yml -f tests/docker-compose.file_share.yml up -d /bin/bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' ${API_ABOUT_PAGE})" != "401" ]]; do sleep 5; done' - docker exec -i cvat /bin/bash -c "echo \"from django.contrib.auth.models import User; User.objects.create_superuser('${DJANGO_SU_NAME}', '${DJANGO_SU_EMAIL}', '${DJANGO_SU_PASSWORD}')\" | python3 ~/manage.py shell" docker exec -i cvat /bin/bash -c "echo \"from django.contrib.auth.models import User; User.objects.create_superuser('${DJANGO_SU_NAME}', '${DJANGO_SU_EMAIL}', '${DJANGO_SU_PASSWORD}')\" | python3 ~/manage.py shell" + docker exec -i cvat /bin/bash -c "echo \"from django.contrib.auth.models import User; User.objects.create_superuser('${DJANGO_SU_NAME}', '${DJANGO_SU_EMAIL}', '${DJANGO_SU_PASSWORD}')\" | python3 ~/manage.py shell" cd ./tests npm ci if [[ ${{ github.ref }} == 'refs/heads/develop' ]]; then diff --git a/.github/workflows/publish_docker_images.yml b/.github/workflows/publish_docker_images.yml index 0cf349d4..3e11e28c 100644 --- a/.github/workflows/publish_docker_images.yml +++ b/.github/workflows/publish_docker_images.yml @@ -31,7 +31,7 @@ jobs: API_ABOUT_PAGE: "localhost:8080/api/v1/server/about" run: | docker-compose -f docker-compose.yml -f docker-compose.dev.yml build - docker-compose -f docker-compose.yml -f docker-compose.dev.yml -f components/serverless/docker-compose.serverless.yml up -d + docker-compose -f docker-compose.yml -f docker-compose.dev.yml -f components/serverless/docker-compose.serverless.yml -f tests/docker-compose.file_share.yml up -d /bin/bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' ${API_ABOUT_PAGE})" != "401" ]]; do sleep 5; done' docker exec -i cvat /bin/bash -c "echo \"from django.contrib.auth.models import User; User.objects.create_superuser('${DJANGO_SU_NAME}', '${DJANGO_SU_EMAIL}', '${DJANGO_SU_PASSWORD}')\" | python3 ~/manage.py shell" cd ./tests diff --git a/.github/workflows/schedule.yml b/.github/workflows/schedule.yml index e7d23696..621b51a4 100644 --- a/.github/workflows/schedule.yml +++ b/.github/workflows/schedule.yml @@ -18,7 +18,7 @@ jobs: DJANGO_SU_PASSWORD: "12qwaszx" API_ABOUT_PAGE: "localhost:8080/api/v1/server/about" run: | - docker-compose -f docker-compose.yml -f docker-compose.dev.yml -f ./tests/docker-compose.email.yml -f components/serverless/docker-compose.serverless.yml up -d --build + docker-compose -f docker-compose.yml -f docker-compose.dev.yml -f ./tests/docker-compose.email.yml -f tests/docker-compose.file_share.yml -f components/serverless/docker-compose.serverless.yml up -d --build /bin/bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' ${API_ABOUT_PAGE})" != "401" ]]; do sleep 5; done' docker exec -i cvat /bin/bash -c "echo \"from django.contrib.auth.models import User; User.objects.create_superuser('${DJANGO_SU_NAME}', '${DJANGO_SU_EMAIL}', '${DJANGO_SU_PASSWORD}')\" | python3 ~/manage.py shell" - name: End-to-end testing diff --git a/cvat-ui/src/reducers/notifications-reducer.ts b/cvat-ui/src/reducers/notifications-reducer.ts index 42051c78..681ee53c 100644 --- a/cvat-ui/src/reducers/notifications-reducer.ts +++ b/cvat-ui/src/reducers/notifications-reducer.ts @@ -1162,6 +1162,7 @@ export default function (state = defaultState, action: AnyAction): Notifications jobFetching: { message: 'Could not fetch frame data from the server', reason: action.payload.error, + className: 'cvat-notification-notice-fetch-frame-data-from-the-server-failed', }, }, }, diff --git a/tests/cypress/integration/actions_tasks3/assets/case_107/image_case_107_1.png b/tests/cypress/integration/actions_tasks3/assets/case_107/image_case_107_1.png new file mode 100644 index 00000000..643a2d9d Binary files /dev/null and b/tests/cypress/integration/actions_tasks3/assets/case_107/image_case_107_1.png differ diff --git a/tests/cypress/integration/actions_tasks3/assets/case_107/image_case_107_2.png b/tests/cypress/integration/actions_tasks3/assets/case_107/image_case_107_2.png new file mode 100644 index 00000000..580010d4 Binary files /dev/null and b/tests/cypress/integration/actions_tasks3/assets/case_107/image_case_107_2.png differ diff --git a/tests/cypress/integration/actions_tasks3/assets/case_107/image_case_107_3.png b/tests/cypress/integration/actions_tasks3/assets/case_107/image_case_107_3.png new file mode 100644 index 00000000..9828fa54 Binary files /dev/null and b/tests/cypress/integration/actions_tasks3/assets/case_107/image_case_107_3.png differ diff --git a/tests/cypress/integration/actions_tasks3/case_107_connected_file_share.js b/tests/cypress/integration/actions_tasks3/case_107_connected_file_share.js new file mode 100644 index 00000000..c604e885 --- /dev/null +++ b/tests/cypress/integration/actions_tasks3/case_107_connected_file_share.js @@ -0,0 +1,92 @@ +// Copyright (C) 2021 Intel Corporation +// +// SPDX-License-Identifier: MIT + +/// + +context('Connected file share.', () => { + const caseId = '107'; + const taskName = `Case ${caseId}`; + const labelName = taskName; + let stdoutToList; + const assetLocalPath = `cypress/integration/actions_tasks3/assets/case_${caseId}`; + + function createOpenTaskWithShare() { + cy.get('#cvat-create-task-button').should('be.visible').click(); + cy.get('#name').type(taskName); + cy.addNewLabel(labelName); + cy.contains('[role="tab"]', 'Connected file share').click(); + cy.get('.cvat-share-tree') + .should('be.visible') + .within(() => { + cy.get('[aria-label="plus-square"]').click(); + cy.exec('docker exec -i cvat /bin/bash -c "ls ~/share"').then((command) => { + stdoutToList = command.stdout.split('\n'); + // [image_case_107_1.png, image_case_107_2.png, image_case_107_3.png] + expect(stdoutToList.length).to.be.eq(3); + // Number of images to select + selection of all images. + cy.get('[title]').should('have.length', stdoutToList.length + 1); + stdoutToList.forEach((el) => { + cy.get(`[title="${el}"]`).should('exist'); + // Click on the checkboxes + cy.get(`[title="${el}"]`).prev().click().should('have.attr', 'class').and('contain', 'checked'); + }); + }); + }); + cy.contains('button', 'Submit').click(); + cy.get('.cvat-notification-create-task-success').should('exist').find('button').click(); + cy.get('.cvat-notification-create-task-success').should('exist').find('[data-icon="close"]').click(); + cy.get('.cvat-task-details').should('exist'); + } + + before(() => { + cy.visit('auth/login'); + cy.login(); + }); + + afterEach(() => { + cy.goToTaskList(); + cy.deleteTask(taskName); + }); + + after(() => { + // Renaming to the original name + cy.exec(`mv ${assetLocalPath}/${stdoutToList[0]}.bk ${assetLocalPath}/${stdoutToList[0]}`); + }); + + describe(`Testing case "${caseId}"`, () => { + it('Create a task with "Connected file share".', () => { + createOpenTaskWithShare(); + cy.openJob(); + cy.get('.cvat-player-filename-wrapper').then((playerFilenameWrapper) => { + for (let el = 0; el < stdoutToList.length; el++) { + cy.get(playerFilenameWrapper).should('have.text', stdoutToList[el]); + cy.checkFrameNum(el); + cy.get('.cvat-player-next-button').click().trigger('mouseout'); + } + }); + }); + + it('Check "Fix problem with getting share data for the task when data not available more in Firefox".', () => { + cy.goToTaskList(); + createOpenTaskWithShare(); + // Rename the image + cy.exec(`mv ${assetLocalPath}/${stdoutToList[0]} ${assetLocalPath}/${stdoutToList[0]}.bk`).then( + (fileRenameCommand) => { + expect(fileRenameCommand.code).to.be.eq(0); + }, + ); + cy.exec(`docker exec -i cvat /bin/bash -c "find ~/share -name "*.png" -type f"`).then( + (findFilesCommand) => { + // [image_case_107_2.png, image_case_107_3.png] + expect(findFilesCommand.stdout.split('\n').length).to.be.eq(2); + }, + ); + cy.openJob(); + cy.get('.cvat-annotation-header').should('exist'); + // Error: . "\"No such file or directory /home/django/share/image_case_107_1.png\"". + cy.get('.cvat-notification-notice-fetch-frame-data-from-the-server-failed').should('exist'); + cy.closeNotification('.cvat-notification-notice-fetch-frame-data-from-the-server-failed'); + }); + }); +}); diff --git a/tests/docker-compose.file_share.yml b/tests/docker-compose.file_share.yml new file mode 100644 index 00000000..d34b8347 --- /dev/null +++ b/tests/docker-compose.file_share.yml @@ -0,0 +1,15 @@ +version: '3.3' + +services: + cvat: + environment: + CVAT_SHARE_URL: 'Mounted from asset for case 107 host directory' + volumes: + - cvat_share:/home/django/share:rw + +volumes: + cvat_share: + driver_opts: + type: none + device: tests/cypress/integration/actions_tasks3/assets/case_107 + o: bind