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: {