Run eslint in CI (#3487)
* Run eslint in CI * Add linting of e2e * Fix formatting * Fix new warnings in e2e * Fix more new warnings
This commit is contained in:
@ -25,6 +25,7 @@
|
|||||||
"files": ["e2e/**/*.ts"], // Update the pattern based on your file structure
|
"files": ["e2e/**/*.ts"], // Update the pattern based on your file structure
|
||||||
"rules": {
|
"rules": {
|
||||||
"@typescript-eslint/no-floating-promises": "warn",
|
"@typescript-eslint/no-floating-promises": "warn",
|
||||||
|
"suggest-no-throw/suggest-no-throw": "off",
|
||||||
"testing-library/prefer-screen-queries": "off"
|
"testing-library/prefer-screen-queries": "off"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
2
.github/workflows/build-test-web.yml
vendored
2
.github/workflows/build-test-web.yml
vendored
@ -44,6 +44,8 @@ jobs:
|
|||||||
- run: yarn build:wasm
|
- run: yarn build:wasm
|
||||||
- run: yarn xstate:typegen
|
- run: yarn xstate:typegen
|
||||||
- run: yarn tsc
|
- run: yarn tsc
|
||||||
|
- name: Lint
|
||||||
|
run: yarn eslint --max-warnings 0 src e2e
|
||||||
|
|
||||||
|
|
||||||
check-typos:
|
check-typos:
|
||||||
|
@ -9,6 +9,7 @@ test.afterEach(async ({ page }, testInfo) => {
|
|||||||
await tearDown(page, testInfo)
|
await tearDown(page, testInfo)
|
||||||
})
|
})
|
||||||
test.describe('Copilot ghost text', () => {
|
test.describe('Copilot ghost text', () => {
|
||||||
|
// eslint-disable-next-line jest/valid-title
|
||||||
test.skip(true, 'Needs to get covered again')
|
test.skip(true, 'Needs to get covered again')
|
||||||
|
|
||||||
test('completes code in empty file', async ({ page }) => {
|
test('completes code in empty file', async ({ page }) => {
|
||||||
|
@ -337,6 +337,7 @@ const sketch001 = startSketchAt([-0, -0])
|
|||||||
}) => {
|
}) => {
|
||||||
// This is being weird on ubuntu and windows.
|
// This is being weird on ubuntu and windows.
|
||||||
test.skip(
|
test.skip(
|
||||||
|
// eslint-disable-next-line jest/valid-title
|
||||||
process.platform === 'linux' || process.platform === 'win32',
|
process.platform === 'linux' || process.platform === 'win32',
|
||||||
'This test is being weird on ubuntu'
|
'This test is being weird on ubuntu'
|
||||||
)
|
)
|
||||||
|
@ -602,7 +602,7 @@ test.describe('Sketch tests', () => {
|
|||||||
await expect(u.codeLocator).toHaveText(codeStr)
|
await expect(u.codeLocator).toHaveText(codeStr)
|
||||||
|
|
||||||
// exit the sketch, reset relative clicker
|
// exit the sketch, reset relative clicker
|
||||||
click00r(undefined, undefined)
|
await click00r(undefined, undefined)
|
||||||
await u.openAndClearDebugPanel()
|
await u.openAndClearDebugPanel()
|
||||||
await page.getByRole('button', { name: 'Exit Sketch' }).click()
|
await page.getByRole('button', { name: 'Exit Sketch' }).click()
|
||||||
await u.expectCmdLog('[data-message-type="execution-done"]')
|
await u.expectCmdLog('[data-message-type="execution-done"]')
|
||||||
|
@ -53,6 +53,7 @@ test(
|
|||||||
async ({ page, context }) => {
|
async ({ page, context }) => {
|
||||||
// skip on macos and windows.
|
// skip on macos and windows.
|
||||||
test.skip(
|
test.skip(
|
||||||
|
// eslint-disable-next-line jest/valid-title
|
||||||
process.platform === 'darwin' || process.platform === 'win32',
|
process.platform === 'darwin' || process.platform === 'win32',
|
||||||
'Skip on macos and windows'
|
'Skip on macos and windows'
|
||||||
)
|
)
|
||||||
|
@ -95,6 +95,8 @@ async function expectCmdLog(page: Page, locatorStr: string, timeout = 5000) {
|
|||||||
await expect(page.locator(locatorStr).last()).toBeVisible({ timeout })
|
await expect(page.locator(locatorStr).last()).toBeVisible({ timeout })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ignoring the lint since I assume someone will want to use this for a test.
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
async function waitForDefaultPlanesToBeVisible(page: Page) {
|
async function waitForDefaultPlanesToBeVisible(page: Page) {
|
||||||
await page.waitForFunction(
|
await page.waitForFunction(
|
||||||
() =>
|
() =>
|
||||||
@ -172,7 +174,8 @@ export const wiggleMove = async (
|
|||||||
const isElVis = await page.locator(locator).isVisible()
|
const isElVis = await page.locator(locator).isVisible()
|
||||||
if (isElVis) return
|
if (isElVis) return
|
||||||
}
|
}
|
||||||
const [x1, y1] = [0, Math.sin((tau / steps) * j * freq) * amplitude]
|
// x1 is 0.
|
||||||
|
const y1 = Math.sin((tau / steps) * j * freq) * amplitude
|
||||||
const [x2, y2] = [
|
const [x2, y2] = [
|
||||||
Math.cos(-ang * deg) * i - Math.sin(-ang * deg) * y1,
|
Math.cos(-ang * deg) * i - Math.sin(-ang * deg) * y1,
|
||||||
Math.sin(-ang * deg) * i + Math.cos(-ang * deg) * y1,
|
Math.sin(-ang * deg) * i + Math.cos(-ang * deg) * y1,
|
||||||
@ -453,7 +456,10 @@ export async function getUtils(page: Page) {
|
|||||||
return page.evaluate('window.tearDown()')
|
return page.evaluate('window.tearDown()')
|
||||||
}
|
}
|
||||||
|
|
||||||
cdpSession?.send('Network.emulateNetworkConditions', networkOptions)
|
return cdpSession?.send(
|
||||||
|
'Network.emulateNetworkConditions',
|
||||||
|
networkOptions
|
||||||
|
)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ test.describe('Testing constraints', () => {
|
|||||||
page.getByRole('button', { name: 'Exit Sketch' })
|
page.getByRole('button', { name: 'Exit Sketch' })
|
||||||
).not.toBeVisible()
|
).not.toBeVisible()
|
||||||
})
|
})
|
||||||
test(`Test remove constraints`, async ({ page }) => {
|
test(`Remove constraints`, async ({ page }) => {
|
||||||
await page.addInitScript(async () => {
|
await page.addInitScript(async () => {
|
||||||
localStorage.setItem(
|
localStorage.setItem(
|
||||||
'persistCode',
|
'persistCode',
|
||||||
|
@ -977,10 +977,6 @@ const part001 = startSketchOn('XZ')
|
|||||||
const hoverPos = { x: segmentToDelete.x, y: segmentToDelete.y }
|
const hoverPos = { x: segmentToDelete.x, y: segmentToDelete.y }
|
||||||
await page.mouse.move(0, 0)
|
await page.mouse.move(0, 0)
|
||||||
await page.waitForTimeout(1000)
|
await page.waitForTimeout(1000)
|
||||||
let x = 0,
|
|
||||||
y = 0
|
|
||||||
x = hoverPos.x + Math.cos(ang * deg) * 32
|
|
||||||
y = hoverPos.y - Math.sin(ang * deg) * 32
|
|
||||||
await page.mouse.move(hoverPos.x, hoverPos.y)
|
await page.mouse.move(hoverPos.x, hoverPos.y)
|
||||||
await wiggleMove(
|
await wiggleMove(
|
||||||
page,
|
page,
|
||||||
|
@ -4,7 +4,6 @@ import { getUtils, setup, setupElectron, tearDown } from './test-utils'
|
|||||||
import { SaveSettingsPayload } from 'lib/settings/settingsTypes'
|
import { SaveSettingsPayload } from 'lib/settings/settingsTypes'
|
||||||
import { TEST_SETTINGS_KEY, TEST_SETTINGS_CORRUPTED } from './storageStates'
|
import { TEST_SETTINGS_KEY, TEST_SETTINGS_CORRUPTED } from './storageStates'
|
||||||
import * as TOML from '@iarna/toml'
|
import * as TOML from '@iarna/toml'
|
||||||
import { APP_NAME } from 'lib/constants'
|
|
||||||
|
|
||||||
test.beforeEach(async ({ context, page }) => {
|
test.beforeEach(async ({ context, page }) => {
|
||||||
await setup(context, page)
|
await setup(context, page)
|
||||||
@ -205,7 +204,6 @@ test.describe('Testing settings', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
await page.setViewportSize({ width: 1200, height: 500 })
|
await page.setViewportSize({ width: 1200, height: 500 })
|
||||||
const u = await getUtils(page)
|
|
||||||
|
|
||||||
page.on('console', console.log)
|
page.on('console', console.log)
|
||||||
|
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
import { test, expect, Page } from '@playwright/test'
|
import { test, expect, Page } from '@playwright/test'
|
||||||
import * as fsp from 'fs/promises'
|
import { getUtils, setup, tearDown } from './test-utils'
|
||||||
import { getUtils, setup, setupElectron, tearDown } from './test-utils'
|
|
||||||
import { join } from 'path'
|
|
||||||
|
|
||||||
test.beforeEach(async ({ context, page }) => {
|
test.beforeEach(async ({ context, page }) => {
|
||||||
await setup(context, page)
|
await setup(context, page)
|
||||||
|
@ -185,6 +185,8 @@ export function Toolbar({
|
|||||||
maybeIconConfig[0].disabled
|
maybeIconConfig[0].disabled
|
||||||
}
|
}
|
||||||
name={maybeIconConfig[0].title}
|
name={maybeIconConfig[0].title}
|
||||||
|
// aria-description is still in ARIA 1.3 draft.
|
||||||
|
// eslint-disable-next-line jsx-a11y/aria-props
|
||||||
aria-description={maybeIconConfig[0].description}
|
aria-description={maybeIconConfig[0].description}
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
maybeIconConfig[0].onClick(configCallbackProps)
|
maybeIconConfig[0].onClick(configCallbackProps)
|
||||||
@ -225,6 +227,8 @@ export function Toolbar({
|
|||||||
(!itemConfig.showTitle ? ' !px-0' : '')
|
(!itemConfig.showTitle ? ' !px-0' : '')
|
||||||
}
|
}
|
||||||
name={itemConfig.title}
|
name={itemConfig.title}
|
||||||
|
// aria-description is still in ARIA 1.3 draft.
|
||||||
|
// eslint-disable-next-line jsx-a11y/aria-props
|
||||||
aria-description={itemConfig.description}
|
aria-description={itemConfig.description}
|
||||||
aria-pressed={itemConfig.isActive}
|
aria-pressed={itemConfig.isActive}
|
||||||
disabled={
|
disabled={
|
||||||
|
@ -154,10 +154,6 @@ export function buildCommandArgument<
|
|||||||
} satisfies Omit<CommandArgument<O, T>, 'inputType'>
|
} satisfies Omit<CommandArgument<O, T>, 'inputType'>
|
||||||
|
|
||||||
if (arg.inputType === 'options') {
|
if (arg.inputType === 'options') {
|
||||||
if (!(arg.options || arg.optionsFromContext)) {
|
|
||||||
throw new Error('Options must be provided for options input type')
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
inputType: arg.inputType,
|
inputType: arg.inputType,
|
||||||
...baseCommandArgument,
|
...baseCommandArgument,
|
||||||
|
@ -38,6 +38,9 @@ const bracket = startSketchOn('XY')
|
|||||||
tags: [getPreviousAdjacentEdge(outerEdge)]
|
tags: [getPreviousAdjacentEdge(outerEdge)]
|
||||||
}, %)`
|
}, %)`
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws Error if the search text is not found in the example code.
|
||||||
|
*/
|
||||||
function findLineInExampleCode({
|
function findLineInExampleCode({
|
||||||
searchText,
|
searchText,
|
||||||
example = bracket,
|
example = bracket,
|
||||||
@ -48,6 +51,8 @@ function findLineInExampleCode({
|
|||||||
const lines = example.split('\n')
|
const lines = example.split('\n')
|
||||||
const lineNumber = lines.findIndex((l) => l.includes(searchText)) + 1
|
const lineNumber = lines.findIndex((l) => l.includes(searchText)) + 1
|
||||||
if (lineNumber === 0) {
|
if (lineNumber === 0) {
|
||||||
|
// We are exporting a constant, so we don't want to return an Error.
|
||||||
|
// eslint-disable-next-line suggest-no-throw/suggest-no-throw
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Could not find the line with search text "${searchText}" in the example code. Was it removed?`
|
`Could not find the line with search text "${searchText}" in the example code. Was it removed?`
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user