diff --git a/labware-library/Makefile b/labware-library/Makefile index a074edd4092..0ea32b222ee 100644 --- a/labware-library/Makefile +++ b/labware-library/Makefile @@ -37,13 +37,25 @@ dev: serve: all node ../scripts/serve-static dist +.PHONY: clean-downloads +clean-downloads: + shx rm -rf cypress/downloads + # end to end tests .PHONY: test-e2e -test-e2e: +test-e2e: clean-downloads concurrently --no-color --kill-others --success first --names "labware-library-server,labware-library-tests" \ - "$(MAKE) dev CYPRESS=1 GTM_ID=''" \ + "$(MAKE) dev GTM_ID=''" \ "wait-on http://localhost:5179/ && echo \"Running cypress at $(date)\" && cypress run --browser chrome --headless --record false" +REMOTE_BASE_URL ?= https://labware.opentrons.com +.PHONY: test-e2e-remote +test-e2e-remote: clean-downloads + @echo "Running cypress tests against $(CYPRESS_BASE_URL)" + @echo "example: make test-e2e-remote REMOTE_BASE_URL='https://labware.opentrons.com'" + @echo + cypress run --browser chrome --headless --config "baseUrl=$(REMOTE_BASE_URL)" + # unit tests .PHONY: test test: diff --git a/labware-library/README.md b/labware-library/README.md index 06982723d7d..3466de2cacf 100644 --- a/labware-library/README.md +++ b/labware-library/README.md @@ -83,3 +83,7 @@ Certain environment variables, when set, will affect the artifact output. | OT_LL_MIXPANEL_DEV_ID | some string ID | Mixpanel token for dev environment. | | OT_LL_VERSION | semver string eg "1.2.3" | reported to analytics. Read from package.json by default. | | OT_LL_BUILD_DATE | result of `new Date().toUTCString()` | reported to analytics. Uses current date-time by default. | + +## Cypress + +`npx cypress open` will open the Cypress test runner. From there, you can run the tests in the `labware-library` directory. diff --git a/labware-library/cypress.config.js b/labware-library/cypress.config.js index e1871656f84..7df4db9fcc6 100644 --- a/labware-library/cypress.config.js +++ b/labware-library/cypress.config.js @@ -3,11 +3,6 @@ const { defineConfig } = require('cypress') module.exports = defineConfig({ video: false, e2e: { - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { - return require('./cypress/plugins/index.js')(on, config) - }, baseUrl: 'http://localhost:5179', }, }) diff --git a/labware-library/cypress/e2e/home.cy.js b/labware-library/cypress/e2e/home.cy.js index 79a39e8712e..20c8015e834 100644 --- a/labware-library/cypress/e2e/home.cy.js +++ b/labware-library/cypress/e2e/home.cy.js @@ -1,7 +1,8 @@ +import { navigateToUrl } from '../support/e2e' + describe('The Desktop Home Page', () => { beforeEach(() => { - cy.visit('/') - cy.viewport('macbook-15') + navigateToUrl('/') }) it('successfully loads', () => { diff --git a/labware-library/cypress/e2e/labware-creator/create.cy.js b/labware-library/cypress/e2e/labware-creator/create.cy.js index 299a3444a86..917b263cb78 100644 --- a/labware-library/cypress/e2e/labware-creator/create.cy.js +++ b/labware-library/cypress/e2e/labware-creator/create.cy.js @@ -2,10 +2,11 @@ // an element is in view before clicking or checking with // { force: true } +import { navigateToUrl } from '../../support/e2e' + context('The Labware Creator Landing Page', () => { beforeEach(() => { - cy.visit('/#/create') - cy.viewport('macbook-15') + navigateToUrl('/#/create') }) describe('The initial text', () => { diff --git a/labware-library/cypress/e2e/labware-creator/customTubeRack.cy.js b/labware-library/cypress/e2e/labware-creator/customTubeRack.cy.js index 319e7f4ea81..b7f9cbbcc30 100644 --- a/labware-library/cypress/e2e/labware-creator/customTubeRack.cy.js +++ b/labware-library/cypress/e2e/labware-creator/customTubeRack.cy.js @@ -1,13 +1,13 @@ -import 'cypress-file-upload' -import { expectDeepEqual } from '@opentrons/shared-data/js/cypressUtils' - -const expectedExportFixture = - '../fixtures/somerackbrand_24_tuberack_1500ul.json' +import { + navigateToUrl, + fileHelper, + wellBottomImageLocator, +} from '../../support/e2e' +const fileHolder = fileHelper('somerackbrand_24_tuberack_1500ul') context('Tubes and Rack', () => { before(() => { - cy.visit('/#/create') - cy.viewport('macbook-15') + navigateToUrl('/#/create') }) describe('Custom 6 x 4 tube rack', () => { @@ -109,24 +109,29 @@ context('Tubes and Rack', () => { cy.contains('Diameter is a required field').should('not.exist') // well bottom shape and depth + // check flat cy.get("input[name='wellBottomShape'][value='flat']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('not.exist') + + // check u shaped cy.get("input[name='wellBottomShape'][value='u']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('exist') + cy.get(wellBottomImageLocator.v).should('not.exist') + + // check v shaped cy.get("input[name='wellBottomShape'][value='v']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('exist') cy.get("input[name='wellDepth']").focus().blur() cy.contains('Depth is a required field').should('exist') cy.get("input[name='wellDepth']").type('100').blur() @@ -159,28 +164,20 @@ context('Tubes and Rack', () => { cy.get( "input[placeholder='somerackbrand 24 Tube Rack with sometubebrand 1.5 mL']" ).should('exist') - cy.get("input[placeholder='somerackbrand_24_tuberack_1500ul']").should( + cy.get(`input[placeholder='${fileHolder.downloadFileStem}']`).should( 'exist' ) - - // now try again with all fields inputed - cy.fixture(expectedExportFixture).then(expectedExportLabwareDef => { - cy.get('button').contains('EXPORT FILE').click() - - cy.window() - .its('__lastSavedFileBlob__') - .should('be.a', 'blob') - .should(async blob => { - const labwareDefText = await blob.text() - const savedDef = JSON.parse(labwareDefText) - - expectDeepEqual(assert, savedDef, expectedExportLabwareDef) + cy.get('button').contains('EXPORT FILE').click() + + cy.fixture(fileHolder.expectedExportFixture).then( + expectedExportLabwareDef => { + cy.readFile(fileHolder.downloadPath).then(actualExportLabwareDef => { + expect(actualExportLabwareDef).to.deep.equal( + expectedExportLabwareDef + ) }) - - cy.window() - .its('__lastSavedFileName__') - .should('equal', `somerackbrand_24_tuberack_1500ul.json`) - }) + } + ) }) }) }) diff --git a/labware-library/cypress/e2e/labware-creator/fileImport.cy.js b/labware-library/cypress/e2e/labware-creator/fileImport.cy.js index e0fc480107f..616edca7d5b 100644 --- a/labware-library/cypress/e2e/labware-creator/fileImport.cy.js +++ b/labware-library/cypress/e2e/labware-creator/fileImport.cy.js @@ -1,11 +1,15 @@ -import { expectDeepEqual } from '@opentrons/shared-data/js/cypressUtils' +import { + navigateToUrl, + fileHelper, + wellBottomImageLocator, +} from '../../support/e2e' +const fileHolder = fileHelper('testpro_15_wellplate_5ul') const importedLabwareFile = 'TestLabwareDefinition.json' describe('File Import', () => { before(() => { - cy.visit('/#/create') - cy.viewport('macbook-15') + navigateToUrl('/#/create') }) it('tests the file import flow', () => { @@ -49,9 +53,9 @@ describe('File Import', () => { // verify well bottom and depth cy.get("input[name='wellBottomShape'][value='flat']").should('exist') - cy.get("img[src*='_flat.']").should('exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellDepth'][value='5']").should('exist') // verify grid spacing @@ -69,7 +73,9 @@ describe('File Import', () => { // File info cy.get("input[placeholder='TestPro 15 Well Plate 5 µL']").should('exist') - cy.get("input[placeholder='testpro_15_wellplate_5ul']").should('exist') + cy.get(`input[placeholder='${fileHolder.downloadFileStem}']`).should( + 'exist' + ) // All fields present cy.get('button[class*="_export_button_"]').click({ force: true }) @@ -77,20 +83,12 @@ describe('File Import', () => { 'Please resolve all invalid fields in order to export the labware definition' ).should('not.exist') - cy.fixture(importedLabwareFile).then(expected => { - cy.window() - .its('__lastSavedFileBlob__') - .should('be.a', 'blob') // wait until we get the blob - .should(async blob => { - const labwareDefText = await blob.text() - const savedDef = JSON.parse(labwareDefText) - - expectDeepEqual(assert, savedDef, expected) + cy.fixture(fileHolder.expectedExportFixture).then( + expectedExportLabwareDef => { + cy.readFile(fileHolder.downloadPath).then(actualExportLabwareDef => { + expect(actualExportLabwareDef).to.deep.equal(expectedExportLabwareDef) }) - }) - - cy.window() - .its('__lastSavedFileName__') - .should('equal', 'testpro_15_wellplate_5ul.json') + } + ) }) }) diff --git a/labware-library/cypress/e2e/labware-creator/reservoir.cy.js b/labware-library/cypress/e2e/labware-creator/reservoir.cy.js index 75197208859..32b18c88a40 100644 --- a/labware-library/cypress/e2e/labware-creator/reservoir.cy.js +++ b/labware-library/cypress/e2e/labware-creator/reservoir.cy.js @@ -1,11 +1,13 @@ -// Scrolling seems wonky, so I disabled checking to see if -// an element is in view before clicking or checking with -// { force: true } +import { + navigateToUrl, + fileHelper, + wellBottomImageLocator, +} from '../../support/e2e' +const fileHolder = fileHelper('testpro_10_reservoir_250ul') context('Reservoirs', () => { before(() => { - cy.visit('/#/create') - cy.viewport('macbook-15') + navigateToUrl('/#/create') }) describe('Reservoir', () => { @@ -143,21 +145,21 @@ context('Reservoirs', () => { cy.get("input[name='wellBottomShape'][value='flat']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='u']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='v']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('exist') cy.get("input[name='wellDepth']").focus().blur() cy.contains('Depth is a required field').should('exist') cy.get("input[name='wellDepth']").type('70').blur() @@ -198,13 +200,24 @@ context('Reservoirs', () => { // File info cy.get("input[placeholder='TestPro 10 Reservoir 250 µL']").should('exist') - cy.get("input[placeholder='testpro_10_reservoir_250ul']").should('exist') + cy.get(`input[placeholder='${fileHolder.downloadFileStem}']`).should( + 'exist' + ) // All fields present cy.get('button[class*="_export_button_"]').click({ force: true }) cy.contains( 'Please resolve all invalid fields in order to export the labware definition' ).should('not.exist') + cy.fixture(fileHolder.expectedExportFixture).then( + expectedExportLabwareDef => { + cy.readFile(fileHolder.downloadPath).then(actualExportLabwareDef => { + expect(actualExportLabwareDef).to.deep.equal( + expectedExportLabwareDef + ) + }) + } + ) }) }) }) diff --git a/labware-library/cypress/e2e/labware-creator/tipRack.cy.js b/labware-library/cypress/e2e/labware-creator/tipRack.cy.js index e69e3dd7285..4d27a47effc 100644 --- a/labware-library/cypress/e2e/labware-creator/tipRack.cy.js +++ b/labware-library/cypress/e2e/labware-creator/tipRack.cy.js @@ -1,12 +1,9 @@ -import 'cypress-file-upload' -import { expectDeepEqual } from '@opentrons/shared-data/js/cypressUtils' - -const expectedExportFixture = '../fixtures/generic_1_tiprack_20ul.json' +import { navigateToUrl, fileHelper } from '../../support/e2e' +const fileHolder = fileHelper('generic_1_tiprack_20ul') describe('Create a Tip Rack', () => { before(() => { - cy.visit('/#/create') - cy.viewport('macbook-15') + navigateToUrl('/#/create') }) it('Should create a tip rack', () => { // Tip Rack Selection from drop down @@ -242,26 +239,19 @@ describe('Create a Tip Rack', () => { cy.get('input[name="displayName"]') .clear() .type('Brand Chalu 1 Tip Rack 20ul') - cy.get('input[name="loadName"]').clear().type('generic_1_tiprack_20ul') + cy.get('input[name="loadName"]').clear().type(fileHolder.downloadFileStem) // Verify the exported file to the fixture cy.get('button').contains('EXPORT FILE').click() - cy.fixture(expectedExportFixture).then(expectedExportLabwareDef => { - cy.window() - .its('__lastSavedFileBlob__') - .should('be.a', 'blob') - .should(async blob => { - const labwareDefText = await blob.text() - const savedDef = JSON.parse(labwareDefText) - - expectDeepEqual(assert, savedDef, expectedExportLabwareDef) + cy.fixture(fileHolder.expectedExportFixture).then( + expectedExportLabwareDef => { + cy.readFile(fileHolder.downloadPath).then(actualExportLabwareDef => { + expect(actualExportLabwareDef).to.deep.equal(expectedExportLabwareDef) }) - }) + } + ) - cy.window() - .its('__lastSavedFileName__') - .should('equal', `generic_1_tiprack_20ul.json`) // 'verify the too big, too small error cy.get('input[name="gridOffsetY"]').clear().type('24') cy.get('#CheckYourWork span') diff --git a/labware-library/cypress/e2e/labware-creator/tubesBlock.cy.js b/labware-library/cypress/e2e/labware-creator/tubesBlock.cy.js index 66ea8d0dedc..4240342390a 100644 --- a/labware-library/cypress/e2e/labware-creator/tubesBlock.cy.js +++ b/labware-library/cypress/e2e/labware-creator/tubesBlock.cy.js @@ -1,12 +1,13 @@ -// Scrolling seems wonky, so I disabled checking to see if -// an element is in view before clicking or checking with -// { force: true } +import { + navigateToUrl, + fileHelper, + wellBottomImageLocator, +} from '../../support/e2e' +const fileHolder = fileHelper('testpro_24_aluminumblock_10ul') context('Tubes and Block', () => { beforeEach(() => { - cy.visit('/#/create') - cy.viewport('macbook-15') - + navigateToUrl('/#/create') cy.get('label') .contains('What type of labware are you creating?') .children() @@ -106,21 +107,21 @@ context('Tubes and Block', () => { cy.get("input[name='wellBottomShape'][value='flat']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='u']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='v']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('exist') cy.get("input[name='wellDepth']").focus().blur() cy.contains('Depth is a required field').should('exist') cy.get("input[name='wellDepth']").type('10').blur() @@ -232,21 +233,21 @@ context('Tubes and Block', () => { cy.get("input[name='wellBottomShape'][value='flat']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='u']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='v']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('exist') cy.get("input[name='wellDepth']").focus().blur() cy.contains('Depth is a required field').should('exist') cy.get("input[name='wellDepth']").type('10').blur() @@ -383,21 +384,21 @@ context('Tubes and Block', () => { cy.get("input[name='wellBottomShape'][value='flat']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='u']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='v']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('exist') cy.get("input[name='wellDepth']").focus().blur() cy.contains('Depth is a required field').should('exist') cy.get("input[name='wellDepth']").type('10').blur() @@ -445,8 +446,7 @@ context('Tubes and Block', () => { }) it('tests the whole form and file export', () => { - cy.visit('/#/create') - cy.viewport('macbook-15') + navigateToUrl('/#/create') cy.get('label') .contains('What type of labware are you creating?') .children() @@ -533,21 +533,21 @@ context('Tubes and Block', () => { cy.get("input[name='wellBottomShape'][value='flat']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='u']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='v']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('exist') cy.get("input[name='wellDepth']").focus().blur() cy.contains('Depth is a required field').should('exist') cy.get("input[name='wellDepth']").type('10').blur() @@ -575,7 +575,7 @@ context('Tubes and Block', () => { cy.get("input[placeholder='TestPro 24 Aluminum Block 10 µL']").should( 'exist' ) - cy.get("input[placeholder='testpro_24_aluminumblock_10ul']").should( + cy.get(`input[placeholder='${fileHolder.downloadFileStem}']`).should( 'exist' ) @@ -584,6 +584,18 @@ context('Tubes and Block', () => { cy.contains( 'Please resolve all invalid fields in order to export the labware definition' ).should('not.exist') + + cy.fixture(fileHolder.expectedExportFixture).then( + expectedExportLabwareDef => { + cy.readFile(fileHolder.downloadPath).then( + actualExportLabwareDef => { + expect(actualExportLabwareDef).to.deep.equal( + expectedExportLabwareDef + ) + } + ) + } + ) }) }) }) diff --git a/labware-library/cypress/e2e/labware-creator/tubesRack.cy.js b/labware-library/cypress/e2e/labware-creator/tubesRack.cy.js index 4214f215dc0..0409221b6a4 100644 --- a/labware-library/cypress/e2e/labware-creator/tubesRack.cy.js +++ b/labware-library/cypress/e2e/labware-creator/tubesRack.cy.js @@ -1,12 +1,9 @@ -// Scrolling seems wonky, so I disabled checking to see if -// an element is in view before clicking or checking with -// { force: true } +import { navigateToUrl, wellBottomImageLocator } from '../../support/e2e' context('Tubes and Rack', () => { describe('Six tubes', () => { before(() => { - cy.visit('/#/create') - cy.viewport('macbook-15') + navigateToUrl('/#/create') cy.get('label') .contains('What type of labware are you creating?') .children() @@ -95,21 +92,21 @@ context('Tubes and Rack', () => { cy.get("input[name='wellBottomShape'][value='flat']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='u']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='v']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('exist') cy.get("input[name='wellDepth']").focus().blur() cy.contains('Depth is a required field').should('exist') cy.get("input[name='wellDepth']").type('10').blur() @@ -137,9 +134,7 @@ context('Tubes and Rack', () => { describe('Fifteen tubes', () => { before(() => { - cy.visit('/#/create') - cy.viewport('macbook-15') - + navigateToUrl('#/create') cy.get('label') .contains('What type of labware are you creating?') .children() @@ -226,21 +221,21 @@ context('Tubes and Rack', () => { cy.get("input[name='wellBottomShape'][value='flat']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='u']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='v']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('exist') cy.get("input[name='wellDepth']").focus().blur() cy.contains('Depth is a required field').should('exist') cy.get("input[name='wellDepth']").type('10').blur() @@ -268,9 +263,7 @@ context('Tubes and Rack', () => { describe('Twentyfour tubes', () => { before(() => { - cy.visit('/#/create') - cy.viewport('macbook-15') - + navigateToUrl('/#/create') cy.get('label') .contains('What type of labware are you creating?') .children() @@ -356,21 +349,21 @@ context('Tubes and Rack', () => { cy.get("input[name='wellBottomShape'][value='flat']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='u']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='v']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('exist') cy.get("input[name='wellDepth']").focus().blur() cy.contains('Depth is a required field').should('exist') cy.get("input[name='wellDepth']").type('10').blur() diff --git a/labware-library/cypress/e2e/labware-creator/wellPlate.cy.js b/labware-library/cypress/e2e/labware-creator/wellPlate.cy.js index 5b27cfcfd72..df12cf153a5 100644 --- a/labware-library/cypress/e2e/labware-creator/wellPlate.cy.js +++ b/labware-library/cypress/e2e/labware-creator/wellPlate.cy.js @@ -2,14 +2,16 @@ // that cannot be imported. The creator probably shouldn't allow // a user to do this. -// Scrolling seems wonky, so I disabled checking to see if -// an element is in view before clicking or checking with -// { force: true } +import { + navigateToUrl, + fileHelper, + wellBottomImageLocator, +} from '../../support/e2e' +const fileHolder = fileHelper('testpro_80_wellplate_100ul') context('Well Plates', () => { before(() => { - cy.visit('/#/create') - cy.viewport('macbook-15') + navigateToUrl('/#/create') }) describe('Create a well plate', () => { @@ -145,21 +147,21 @@ context('Well Plates', () => { cy.get("input[name='wellBottomShape'][value='flat']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='u']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('exist') - cy.get("img[src*='_v.']").should('not.exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('exist') + cy.get(wellBottomImageLocator.v).should('not.exist') cy.get("input[name='wellBottomShape'][value='v']").check({ force: true, }) - cy.get("img[src*='_flat.']").should('not.exist') - cy.get("img[src*='_round.']").should('not.exist') - cy.get("img[src*='_v.']").should('exist') + cy.get(wellBottomImageLocator.flat).should('not.exist') + cy.get(wellBottomImageLocator.round).should('not.exist') + cy.get(wellBottomImageLocator.v).should('exist') cy.get("input[name='wellDepth']").focus().blur() cy.contains('Depth is a required field').should('exist') cy.get("input[name='wellDepth']").type('10').blur() @@ -208,7 +210,9 @@ context('Well Plates', () => { cy.get("input[placeholder='TestPro 80 Well Plate 100 µL']").should( 'exist' ) - cy.get("input[placeholder='testpro_80_wellplate_100ul']").should('exist') + cy.get(`input[placeholder='${fileHolder.downloadFileStem}']`).should( + 'exist' + ) // All fields present cy.get('button[class*="_export_button_"]').click({ force: true }) @@ -216,7 +220,15 @@ context('Well Plates', () => { 'Please resolve all invalid fields in order to export the labware definition' ).should('not.exist') - // TODO IMMEDIATELY match against fixture ??? Is this not happening? + cy.fixture(fileHolder.expectedExportFixture).then( + expectedExportLabwareDef => { + cy.readFile(fileHolder.downloadPath).then(actualExportLabwareDef => { + expect(actualExportLabwareDef).to.deep.equal( + expectedExportLabwareDef + ) + }) + } + ) }) }) }) diff --git a/labware-library/cypress/e2e/navigation.cy.js b/labware-library/cypress/e2e/navigation.cy.js index 83ce2dd7369..0b4c3c14a40 100644 --- a/labware-library/cypress/e2e/navigation.cy.js +++ b/labware-library/cypress/e2e/navigation.cy.js @@ -1,7 +1,8 @@ +import { navigateToUrl } from '../support/e2e' + describe('Desktop Navigation', () => { beforeEach(() => { - cy.visit('/') - cy.viewport('macbook-15') + navigateToUrl('/') }) it('contains the subdomain nav bar', () => { diff --git a/labware-library/cypress/fixtures/testpro_10_reservoir_250ul.json b/labware-library/cypress/fixtures/testpro_10_reservoir_250ul.json new file mode 100644 index 00000000000..5941e1b3e5e --- /dev/null +++ b/labware-library/cypress/fixtures/testpro_10_reservoir_250ul.json @@ -0,0 +1,154 @@ +{ + "ordering": [ + ["A1"], + ["A2"], + ["A3"], + ["A4"], + ["A5"], + ["A6"], + ["A7"], + ["A8"], + ["A9"], + ["A10"] + ], + "brand": { + "brand": "TestPro", + "brandId": ["001"] + }, + "metadata": { + "displayName": "TestPro 10 Reservoir 250 µL", + "displayCategory": "reservoir", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127, + "yDimension": 85, + "zDimension": 75 + }, + "wells": { + "A1": { + "depth": 70, + "totalLiquidVolume": 250, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 60, + "x": 10, + "y": 40, + "z": 5 + }, + "A2": { + "depth": 70, + "totalLiquidVolume": 250, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 60, + "x": 22, + "y": 40, + "z": 5 + }, + "A3": { + "depth": 70, + "totalLiquidVolume": 250, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 60, + "x": 34, + "y": 40, + "z": 5 + }, + "A4": { + "depth": 70, + "totalLiquidVolume": 250, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 60, + "x": 46, + "y": 40, + "z": 5 + }, + "A5": { + "depth": 70, + "totalLiquidVolume": 250, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 60, + "x": 58, + "y": 40, + "z": 5 + }, + "A6": { + "depth": 70, + "totalLiquidVolume": 250, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 60, + "x": 70, + "y": 40, + "z": 5 + }, + "A7": { + "depth": 70, + "totalLiquidVolume": 250, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 60, + "x": 82, + "y": 40, + "z": 5 + }, + "A8": { + "depth": 70, + "totalLiquidVolume": 250, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 60, + "x": 94, + "y": 40, + "z": 5 + }, + "A9": { + "depth": 70, + "totalLiquidVolume": 250, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 60, + "x": 106, + "y": 40, + "z": 5 + }, + "A10": { + "depth": 70, + "totalLiquidVolume": 250, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 60, + "x": 118, + "y": 40, + "z": 5 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": ["A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10"] + } + ], + "parameters": { + "format": "irregular", + "quirks": [], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "testpro_10_reservoir_250ul" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} diff --git a/labware-library/cypress/fixtures/testpro_15_wellplate_5ul.json b/labware-library/cypress/fixtures/testpro_15_wellplate_5ul.json new file mode 100644 index 00000000000..6eac7bd5fc6 --- /dev/null +++ b/labware-library/cypress/fixtures/testpro_15_wellplate_5ul.json @@ -0,0 +1,200 @@ +{ + "ordering": [ + ["A1", "B1", "C1"], + ["A2", "B2", "C2"], + ["A3", "B3", "C3"], + ["A4", "B4", "C4"], + ["A5", "B5", "C5"] + ], + "brand": { + "brand": "TestPro", + "brandId": ["001"] + }, + "metadata": { + "displayName": "TestPro 15 Well Plate 5 µL", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127, + "yDimension": 85, + "zDimension": 5 + }, + "wells": { + "A1": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 10, + "y": 75, + "z": 0 + }, + "B1": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 10, + "y": 50, + "z": 0 + }, + "C1": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 10, + "y": 25, + "z": 0 + }, + "A2": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 35, + "y": 75, + "z": 0 + }, + "B2": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 35, + "y": 50, + "z": 0 + }, + "C2": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 35, + "y": 25, + "z": 0 + }, + "A3": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 60, + "y": 75, + "z": 0 + }, + "B3": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 60, + "y": 50, + "z": 0 + }, + "C3": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 60, + "y": 25, + "z": 0 + }, + "A4": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 85, + "y": 75, + "z": 0 + }, + "B4": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 85, + "y": 50, + "z": 0 + }, + "C4": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 85, + "y": 25, + "z": 0 + }, + "A5": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 110, + "y": 75, + "z": 0 + }, + "B5": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 110, + "y": 50, + "z": 0 + }, + "C5": { + "depth": 5, + "totalLiquidVolume": 5, + "shape": "circular", + "diameter": 5, + "x": 110, + "y": 25, + "z": 0 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat" + }, + "wells": [ + "A1", + "B1", + "C1", + "A2", + "B2", + "C2", + "A3", + "B3", + "C3", + "A4", + "B4", + "C4", + "A5", + "B5", + "C5" + ] + } + ], + "parameters": { + "format": "irregular", + "quirks": [], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "testpro_15_wellplate_5ul" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} diff --git a/labware-library/cypress/fixtures/testpro_24_aluminumblock_10ul.json b/labware-library/cypress/fixtures/testpro_24_aluminumblock_10ul.json new file mode 100644 index 00000000000..d653e918f90 --- /dev/null +++ b/labware-library/cypress/fixtures/testpro_24_aluminumblock_10ul.json @@ -0,0 +1,316 @@ +{ + "ordering": [ + ["A1", "B1", "C1", "D1"], + ["A2", "B2", "C2", "D2"], + ["A3", "B3", "C3", "D3"], + ["A4", "B4", "C4", "D4"], + ["A5", "B5", "C5", "D5"], + ["A6", "B6", "C6", "D6"] + ], + "brand": { + "brand": "TestPro", + "brandId": ["001"] + }, + "metadata": { + "displayName": "TestPro 24 Aluminum Block 10 µL", + "displayCategory": "aluminumBlock", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.5, + "zDimension": 75 + }, + "wells": { + "A1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 20.75, + "y": 68.63, + "z": 65 + }, + "B1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 20.75, + "y": 51.38, + "z": 65 + }, + "C1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 20.75, + "y": 34.13, + "z": 65 + }, + "D1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 20.75, + "y": 16.88, + "z": 65 + }, + "A2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 38, + "y": 68.63, + "z": 65 + }, + "B2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 38, + "y": 51.38, + "z": 65 + }, + "C2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 38, + "y": 34.13, + "z": 65 + }, + "D2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 38, + "y": 16.88, + "z": 65 + }, + "A3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 55.25, + "y": 68.63, + "z": 65 + }, + "B3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 55.25, + "y": 51.38, + "z": 65 + }, + "C3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 55.25, + "y": 34.13, + "z": 65 + }, + "D3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 55.25, + "y": 16.88, + "z": 65 + }, + "A4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 72.5, + "y": 68.63, + "z": 65 + }, + "B4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 72.5, + "y": 51.38, + "z": 65 + }, + "C4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 72.5, + "y": 34.13, + "z": 65 + }, + "D4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 72.5, + "y": 16.88, + "z": 65 + }, + "A5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 89.75, + "y": 68.63, + "z": 65 + }, + "B5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 89.75, + "y": 51.38, + "z": 65 + }, + "C5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 89.75, + "y": 34.13, + "z": 65 + }, + "D5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 89.75, + "y": 16.88, + "z": 65 + }, + "A6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 107, + "y": 68.63, + "z": 65 + }, + "B6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 107, + "y": 51.38, + "z": 65 + }, + "C6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 107, + "y": 34.13, + "z": 65 + }, + "D6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 107, + "y": 16.88, + "z": 65 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v", + "displayCategory": "tubeRack" + }, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "A2", + "B2", + "C2", + "D2", + "A3", + "B3", + "C3", + "D3", + "A4", + "B4", + "C4", + "D4", + "A5", + "B5", + "C5", + "D5", + "A6", + "B6", + "C6", + "D6" + ] + } + ], + "parameters": { + "format": "irregular", + "quirks": [], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "testpro_24_aluminumblock_10ul" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} diff --git a/labware-library/cypress/fixtures/testpro_80_wellplate_100ul.json b/labware-library/cypress/fixtures/testpro_80_wellplate_100ul.json new file mode 100644 index 00000000000..f51b575836a --- /dev/null +++ b/labware-library/cypress/fixtures/testpro_80_wellplate_100ul.json @@ -0,0 +1,935 @@ +{ + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"] + ], + "brand": { + "brand": "TestPro", + "brandId": ["001"] + }, + "metadata": { + "displayName": "TestPro 80 Well Plate 100 µL", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127, + "yDimension": 85, + "zDimension": 75 + }, + "wells": { + "A1": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 10, + "y": 77, + "z": 65 + }, + "B1": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 10, + "y": 67, + "z": 65 + }, + "C1": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 10, + "y": 57, + "z": 65 + }, + "D1": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 10, + "y": 47, + "z": 65 + }, + "E1": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 10, + "y": 37, + "z": 65 + }, + "F1": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 10, + "y": 27, + "z": 65 + }, + "G1": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 10, + "y": 17, + "z": 65 + }, + "H1": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 10, + "y": 7, + "z": 65 + }, + "A2": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 22, + "y": 77, + "z": 65 + }, + "B2": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 22, + "y": 67, + "z": 65 + }, + "C2": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 22, + "y": 57, + "z": 65 + }, + "D2": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 22, + "y": 47, + "z": 65 + }, + "E2": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 22, + "y": 37, + "z": 65 + }, + "F2": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 22, + "y": 27, + "z": 65 + }, + "G2": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 22, + "y": 17, + "z": 65 + }, + "H2": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 22, + "y": 7, + "z": 65 + }, + "A3": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 34, + "y": 77, + "z": 65 + }, + "B3": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 34, + "y": 67, + "z": 65 + }, + "C3": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 34, + "y": 57, + "z": 65 + }, + "D3": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 34, + "y": 47, + "z": 65 + }, + "E3": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 34, + "y": 37, + "z": 65 + }, + "F3": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 34, + "y": 27, + "z": 65 + }, + "G3": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 34, + "y": 17, + "z": 65 + }, + "H3": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 34, + "y": 7, + "z": 65 + }, + "A4": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 46, + "y": 77, + "z": 65 + }, + "B4": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 46, + "y": 67, + "z": 65 + }, + "C4": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 46, + "y": 57, + "z": 65 + }, + "D4": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 46, + "y": 47, + "z": 65 + }, + "E4": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 46, + "y": 37, + "z": 65 + }, + "F4": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 46, + "y": 27, + "z": 65 + }, + "G4": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 46, + "y": 17, + "z": 65 + }, + "H4": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 46, + "y": 7, + "z": 65 + }, + "A5": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 58, + "y": 77, + "z": 65 + }, + "B5": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 58, + "y": 67, + "z": 65 + }, + "C5": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 58, + "y": 57, + "z": 65 + }, + "D5": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 58, + "y": 47, + "z": 65 + }, + "E5": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 58, + "y": 37, + "z": 65 + }, + "F5": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 58, + "y": 27, + "z": 65 + }, + "G5": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 58, + "y": 17, + "z": 65 + }, + "H5": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 58, + "y": 7, + "z": 65 + }, + "A6": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 70, + "y": 77, + "z": 65 + }, + "B6": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 70, + "y": 67, + "z": 65 + }, + "C6": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 70, + "y": 57, + "z": 65 + }, + "D6": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 70, + "y": 47, + "z": 65 + }, + "E6": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 70, + "y": 37, + "z": 65 + }, + "F6": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 70, + "y": 27, + "z": 65 + }, + "G6": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 70, + "y": 17, + "z": 65 + }, + "H6": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 70, + "y": 7, + "z": 65 + }, + "A7": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 82, + "y": 77, + "z": 65 + }, + "B7": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 82, + "y": 67, + "z": 65 + }, + "C7": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 82, + "y": 57, + "z": 65 + }, + "D7": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 82, + "y": 47, + "z": 65 + }, + "E7": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 82, + "y": 37, + "z": 65 + }, + "F7": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 82, + "y": 27, + "z": 65 + }, + "G7": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 82, + "y": 17, + "z": 65 + }, + "H7": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 82, + "y": 7, + "z": 65 + }, + "A8": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 94, + "y": 77, + "z": 65 + }, + "B8": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 94, + "y": 67, + "z": 65 + }, + "C8": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 94, + "y": 57, + "z": 65 + }, + "D8": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 94, + "y": 47, + "z": 65 + }, + "E8": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 94, + "y": 37, + "z": 65 + }, + "F8": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 94, + "y": 27, + "z": 65 + }, + "G8": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 94, + "y": 17, + "z": 65 + }, + "H8": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 94, + "y": 7, + "z": 65 + }, + "A9": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 106, + "y": 77, + "z": 65 + }, + "B9": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 106, + "y": 67, + "z": 65 + }, + "C9": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 106, + "y": 57, + "z": 65 + }, + "D9": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 106, + "y": 47, + "z": 65 + }, + "E9": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 106, + "y": 37, + "z": 65 + }, + "F9": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 106, + "y": 27, + "z": 65 + }, + "G9": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 106, + "y": 17, + "z": 65 + }, + "H9": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 106, + "y": 7, + "z": 65 + }, + "A10": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 118, + "y": 77, + "z": 65 + }, + "B10": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 118, + "y": 67, + "z": 65 + }, + "C10": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 118, + "y": 57, + "z": 65 + }, + "D10": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 118, + "y": 47, + "z": 65 + }, + "E10": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 118, + "y": 37, + "z": 65 + }, + "F10": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 118, + "y": 27, + "z": 65 + }, + "G10": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 118, + "y": 17, + "z": 65 + }, + "H10": { + "depth": 10, + "totalLiquidVolume": 100, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8, + "x": 118, + "y": 7, + "z": 65 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ] + } + ], + "parameters": { + "format": "irregular", + "quirks": [], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "testpro_80_wellplate_100ul" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} diff --git a/labware-library/cypress/fixtures/testpro_96_aluminumblock_10ul.json b/labware-library/cypress/fixtures/testpro_96_aluminumblock_10ul.json new file mode 100644 index 00000000000..0b99d24def6 --- /dev/null +++ b/labware-library/cypress/fixtures/testpro_96_aluminumblock_10ul.json @@ -0,0 +1,1114 @@ +{ + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] + ], + "brand": { + "brand": "TestPro", + "brandId": ["001"] + }, + "metadata": { + "displayName": "TestPro 96 Aluminum Block 10 µL", + "displayCategory": "aluminumBlock", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.5, + "zDimension": 75 + }, + "wells": { + "A1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 14.38, + "y": 74.25, + "z": 65 + }, + "B1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 14.38, + "y": 65.25, + "z": 65 + }, + "C1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 14.38, + "y": 56.25, + "z": 65 + }, + "D1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 14.38, + "y": 47.25, + "z": 65 + }, + "E1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 14.38, + "y": 38.25, + "z": 65 + }, + "F1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 14.38, + "y": 29.25, + "z": 65 + }, + "G1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 14.38, + "y": 20.25, + "z": 65 + }, + "H1": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 14.38, + "y": 11.25, + "z": 65 + }, + "A2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 23.38, + "y": 74.25, + "z": 65 + }, + "B2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 23.38, + "y": 65.25, + "z": 65 + }, + "C2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 23.38, + "y": 56.25, + "z": 65 + }, + "D2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 23.38, + "y": 47.25, + "z": 65 + }, + "E2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 23.38, + "y": 38.25, + "z": 65 + }, + "F2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 23.38, + "y": 29.25, + "z": 65 + }, + "G2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 23.38, + "y": 20.25, + "z": 65 + }, + "H2": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 23.38, + "y": 11.25, + "z": 65 + }, + "A3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 32.38, + "y": 74.25, + "z": 65 + }, + "B3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 32.38, + "y": 65.25, + "z": 65 + }, + "C3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 32.38, + "y": 56.25, + "z": 65 + }, + "D3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 32.38, + "y": 47.25, + "z": 65 + }, + "E3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 32.38, + "y": 38.25, + "z": 65 + }, + "F3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 32.38, + "y": 29.25, + "z": 65 + }, + "G3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 32.38, + "y": 20.25, + "z": 65 + }, + "H3": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 32.38, + "y": 11.25, + "z": 65 + }, + "A4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 41.38, + "y": 74.25, + "z": 65 + }, + "B4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 41.38, + "y": 65.25, + "z": 65 + }, + "C4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 41.38, + "y": 56.25, + "z": 65 + }, + "D4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 41.38, + "y": 47.25, + "z": 65 + }, + "E4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 41.38, + "y": 38.25, + "z": 65 + }, + "F4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 41.38, + "y": 29.25, + "z": 65 + }, + "G4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 41.38, + "y": 20.25, + "z": 65 + }, + "H4": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 41.38, + "y": 11.25, + "z": 65 + }, + "A5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 50.38, + "y": 74.25, + "z": 65 + }, + "B5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 50.38, + "y": 65.25, + "z": 65 + }, + "C5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 50.38, + "y": 56.25, + "z": 65 + }, + "D5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 50.38, + "y": 47.25, + "z": 65 + }, + "E5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 50.38, + "y": 38.25, + "z": 65 + }, + "F5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 50.38, + "y": 29.25, + "z": 65 + }, + "G5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 50.38, + "y": 20.25, + "z": 65 + }, + "H5": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 50.38, + "y": 11.25, + "z": 65 + }, + "A6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 59.38, + "y": 74.25, + "z": 65 + }, + "B6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 59.38, + "y": 65.25, + "z": 65 + }, + "C6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 59.38, + "y": 56.25, + "z": 65 + }, + "D6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 59.38, + "y": 47.25, + "z": 65 + }, + "E6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 59.38, + "y": 38.25, + "z": 65 + }, + "F6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 59.38, + "y": 29.25, + "z": 65 + }, + "G6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 59.38, + "y": 20.25, + "z": 65 + }, + "H6": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 59.38, + "y": 11.25, + "z": 65 + }, + "A7": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 68.38, + "y": 74.25, + "z": 65 + }, + "B7": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 68.38, + "y": 65.25, + "z": 65 + }, + "C7": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 68.38, + "y": 56.25, + "z": 65 + }, + "D7": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 68.38, + "y": 47.25, + "z": 65 + }, + "E7": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 68.38, + "y": 38.25, + "z": 65 + }, + "F7": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 68.38, + "y": 29.25, + "z": 65 + }, + "G7": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 68.38, + "y": 20.25, + "z": 65 + }, + "H7": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 68.38, + "y": 11.25, + "z": 65 + }, + "A8": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 77.38, + "y": 74.25, + "z": 65 + }, + "B8": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 77.38, + "y": 65.25, + "z": 65 + }, + "C8": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 77.38, + "y": 56.25, + "z": 65 + }, + "D8": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 77.38, + "y": 47.25, + "z": 65 + }, + "E8": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 77.38, + "y": 38.25, + "z": 65 + }, + "F8": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 77.38, + "y": 29.25, + "z": 65 + }, + "G8": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 77.38, + "y": 20.25, + "z": 65 + }, + "H8": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 77.38, + "y": 11.25, + "z": 65 + }, + "A9": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 86.38, + "y": 74.25, + "z": 65 + }, + "B9": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 86.38, + "y": 65.25, + "z": 65 + }, + "C9": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 86.38, + "y": 56.25, + "z": 65 + }, + "D9": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 86.38, + "y": 47.25, + "z": 65 + }, + "E9": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 86.38, + "y": 38.25, + "z": 65 + }, + "F9": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 86.38, + "y": 29.25, + "z": 65 + }, + "G9": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 86.38, + "y": 20.25, + "z": 65 + }, + "H9": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 86.38, + "y": 11.25, + "z": 65 + }, + "A10": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 95.38, + "y": 74.25, + "z": 65 + }, + "B10": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 95.38, + "y": 65.25, + "z": 65 + }, + "C10": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 95.38, + "y": 56.25, + "z": 65 + }, + "D10": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 95.38, + "y": 47.25, + "z": 65 + }, + "E10": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 95.38, + "y": 38.25, + "z": 65 + }, + "F10": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 95.38, + "y": 29.25, + "z": 65 + }, + "G10": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 95.38, + "y": 20.25, + "z": 65 + }, + "H10": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 95.38, + "y": 11.25, + "z": 65 + }, + "A11": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 104.38, + "y": 74.25, + "z": 65 + }, + "B11": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 104.38, + "y": 65.25, + "z": 65 + }, + "C11": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 104.38, + "y": 56.25, + "z": 65 + }, + "D11": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 104.38, + "y": 47.25, + "z": 65 + }, + "E11": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 104.38, + "y": 38.25, + "z": 65 + }, + "F11": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 104.38, + "y": 29.25, + "z": 65 + }, + "G11": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 104.38, + "y": 20.25, + "z": 65 + }, + "H11": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 104.38, + "y": 11.25, + "z": 65 + }, + "A12": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 113.38, + "y": 74.25, + "z": 65 + }, + "B12": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 113.38, + "y": 65.25, + "z": 65 + }, + "C12": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 113.38, + "y": 56.25, + "z": 65 + }, + "D12": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 113.38, + "y": 47.25, + "z": 65 + }, + "E12": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 113.38, + "y": 38.25, + "z": 65 + }, + "F12": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 113.38, + "y": 29.25, + "z": 65 + }, + "G12": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 113.38, + "y": 20.25, + "z": 65 + }, + "H12": { + "depth": 10, + "totalLiquidVolume": 10, + "shape": "rectangular", + "xDimension": 10, + "yDimension": 10, + "x": 113.38, + "y": 11.25, + "z": 65 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v", + "displayCategory": "wellPlate" + }, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ] + } + ], + "parameters": { + "format": "irregular", + "quirks": [], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "testpro_96_aluminumblock_10ul" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} diff --git a/labware-library/cypress/mocks/file-saver.js b/labware-library/cypress/mocks/file-saver.js deleted file mode 100644 index d4c7febe539..00000000000 --- a/labware-library/cypress/mocks/file-saver.js +++ /dev/null @@ -1,6 +0,0 @@ -// mock for 'file-saver' npm module - -export const saveAs = (blob, fileName) => { - global.__lastSavedFileBlob__ = blob - global.__lastSavedFileName__ = fileName -} diff --git a/labware-library/cypress/plugins/index.js b/labware-library/cypress/plugins/index.js deleted file mode 100644 index f392875c7d9..00000000000 --- a/labware-library/cypress/plugins/index.js +++ /dev/null @@ -1,23 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/triple-slash-reference -/// -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -/** - * @type {Cypress.PluginConfig} - */ -// eslint-disable-next-line no-unused-vars -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -} diff --git a/labware-library/cypress/support/e2e.js b/labware-library/cypress/support/e2e.js deleted file mode 100644 index d68db96df26..00000000000 --- a/labware-library/cypress/support/e2e.js +++ /dev/null @@ -1,20 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands' - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/labware-library/cypress/support/e2e.ts b/labware-library/cypress/support/e2e.ts new file mode 100644 index 00000000000..85dcff19ba8 --- /dev/null +++ b/labware-library/cypress/support/e2e.ts @@ -0,0 +1,40 @@ +// *********************************************************** +// This file runs before every single spec file. +// We do this purely as a convenience mechanism so you don't have to import this file. +// https://docs.cypress.io/guides/core-concepts/writing-and-organizing-tests#Support-file +// *********************************************************** +import { join } from 'path' +import './commands' + +export const navigateToUrl = (url: string): void => { + cy.visit(url) + cy.viewport('macbook-15') +} + +export const wellBottomImageLocator: Record = { + flat: 'img[alt*="flat bottom"]', + round: 'img[alt*="u shaped"]', + v: 'img[alt*="v shaped"]', +} + +interface FileHelperResult { + downloadsFolder: string + downloadFileStem: string + downloadFilename: string + downloadPath: string + expectedExportFixture: string +} + +export const fileHelper = (fileStem: string): FileHelperResult => { + const downloadsFolder = Cypress.config('downloadsFolder') + const downloadFileStem = fileStem + const downloadFilename = `${downloadFileStem}.json` + const downloadPath = join(downloadsFolder, downloadFilename) + return { + downloadsFolder, + downloadFileStem, + downloadFilename, + downloadPath, + expectedExportFixture: `../fixtures/${downloadFilename}`, + } +} diff --git a/labware-library/vite.config.mts b/labware-library/vite.config.mts index 43d5065c011..0c05338af06 100644 --- a/labware-library/vite.config.mts +++ b/labware-library/vite.config.mts @@ -8,14 +8,6 @@ import postCssPresetEnv from 'postcss-preset-env' import lostCss from 'lost' import { cssModuleSideEffect } from './cssModuleSideEffect' -const testAliases: {} | { 'file-saver': string } = - process.env.CYPRESS === '1' - ? { - 'file-saver': - path.resolve(__dirname, 'cypress/mocks/file-saver.js') ?? '', - } - : {} - export default defineConfig({ // this makes imports relative rather than absolute base: '', @@ -70,7 +62,6 @@ export default defineConfig({ '@opentrons/step-generation': path.resolve( '../step-generation/src/index.ts' ), - ...testAliases, }, }, server: {