Skip to content

Commit

Permalink
Merge branch 'main' into fix/FET-1619
Browse files Browse the repository at this point in the history
  • Loading branch information
sugh01 committed Sep 12, 2024
2 parents 82ec31f + 165b7ff commit dddb614
Show file tree
Hide file tree
Showing 78 changed files with 1,292 additions and 2,588 deletions.
22 changes: 22 additions & 0 deletions .github/workflows/knip.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: Knip

on: [push]

jobs:
knip:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Install pnpm
run: corepack enable pnpm

- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: 18
cache: 'pnpm'

- run: pnpm install --frozen-lockfile

- run: pnpm knip
2 changes: 2 additions & 0 deletions .github/workflows/pages-deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ jobs:
run: |
mkdir -p ./out/sitemaps
pnpm generate:sitemaps
env:
SITEMAP_GRAPH_KEY: ${{ secrets.SITEMAP_GRAPH_KEY }}

- name: Publish
uses: cloudflare/pages-action@v1
Expand Down
59 changes: 59 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -507,3 +507,62 @@ Our testing philosophy is user-centric, meaning we want to write out tests so th
A user generally clicks, types and swipes, and so most tests should include one of these actions. A user may also load a page in a specific state (by clicking, typing or swiping outside of the app) so sometimes we just want to check a page renders correctly. The vast majority of our tests will be of these kinds.

For deeper parts of the codebase that aren't directly related to a user interaction, such as utility functions, the user is the developer. So simply test the code in the way a developer would use it.

## Knip Configuration Guide

### 1. Install Knip:

Install Knip as a development dependency in your project:

```bash
pnpm add -D knip
```

### 2. Add a knip script to your package.json:

Add a script to your package.json for easy access to Knip:

```json
{
"scripts": {
...,
"knip": "knip",
"knip:fix": "knip --fix --allow-remove-files"
}
}
```

### 3. Create Knip Configuration File:

Create a `knip.config.ts` file at the root of your project. For more detail of configuration options, refer to the [knip.config.ts file](knip.config.ts) in the ENSDomains repository.

### 4. Run Knip:

To analyze your project, run Knip using the following command:

```bash
pnpm knip
```
Knip will exit with code `1` if any issues are found, such as unused files, dependencies, or exports that need to be removed.

### 5. Review and Remove Unused Files

After Knip completes its analysis, review the results. Manually remove any unused files that are safe to delete, or let Knip handle it automatically with the following command:

```bash
pnpm knip:fix
```

Ensure you carefully examine any files marked for removal to avoid accidentally deleting necessary code.

### 6. Run Unit Tests and E2E Tests:

After removing files, it's important to run your unit and end-to-end tests to ensure that everything is still functioning correctly:

```bash
pnpm test:coverage
```

```bash
pnpm e2e
```
186 changes: 184 additions & 2 deletions e2e/specs/stateless/wrapName.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ test('should not show wrap notification if the name is already wrapped', async (

await page.waitForTimeout(3000)
await expect(morePage.wrapButton).not.toBeVisible()

await expect(morePage.pccStatus).toBeVisible()
await expect(morePage.nameWrapperStatus).toHaveText('Wrapped')
})

test('should show wrap button on unwrapped name', async ({ login, makeName, makePageObject }) => {
Expand Down Expand Up @@ -255,7 +258,7 @@ test('should calculate needed steps without localstorage', async ({
await login.connect()

await page.pause()
await expect(page.getByTestId('name-details-text-wrapper')).toContainText('unwrapped')
await expect(page.getByTestId('namewrapper-status')).toContainText('Unwrapped')

await morePage.wrapButton.click()
await page.pause()
Expand Down Expand Up @@ -291,8 +294,187 @@ test('should calculate needed steps without localstorage', async ({
await transactionModal.introButton.click()
await transactionModal.confirm()
await transactionModal.complete()
await expect(page.getByTestId('name-details-text-wrapper')).not.toContainText('unwrapped')
await expect(page.getByTestId('namewrapper-status')).not.toContainText('Unwrapped')

await profilePage.goto(subname)
await expect(profilePage.record('text', 'description')).toHaveText('test')
})

test('Wrapped, emancipated, 2LD', async ({ login, makeName, makePageObject }) => {
const name = await makeName({
label: 'wrapped',
type: 'wrapped',
owner: 'user',
})

const morePage = makePageObject('MorePage')
await morePage.goto(name)

await login.connect()

await expect(morePage.wrapButton).not.toBeVisible()
await expect(morePage.unwrapButton).toBeVisible()
await expect(morePage.nameWrapperStatus).toContainText('Wrapped')
await expect(morePage.pccStatus).toContainText('Not parent-controllable')
await expect(morePage.nameWrapperCheckIcon).toBeVisible()
await expect(morePage.npcIcon).toBeVisible()
})

test('Wrapped, locked, 2LD', async ({ login, makeName, makePageObject }) => {
const name = await makeName({
label: 'wrapped',
type: 'wrapped',
owner: 'user',
fuses: {
named: ['CANNOT_UNWRAP'],
},
})

const morePage = makePageObject('MorePage')
await morePage.goto(name)

await login.connect()

await expect(morePage.wrapButton).not.toBeVisible()
await expect(morePage.unwrapButtonDisabled).toBeVisible()
await expect(morePage.nameWrapperStatus).toContainText('Wrapped')
await expect(morePage.pccStatus).toContainText('Not parent-controllable')
await expect(morePage.nameWrapperLockIcon).toBeVisible()
await expect(morePage.npcIcon).toBeVisible()
})

test('Wrapped, not-emancipated (PCC), 3LD', async ({ login, makeName, makePageObject }) => {
const name = await makeName({
label: 'wrapped',
type: 'wrapped',
owner: 'user',
subnames: [
{
label: 'test',
owner: 'user',
},
],
})

const morePage = makePageObject('MorePage')
await morePage.goto(`test.${name}`)

await login.connect()

await expect(morePage.unwrapButton).toBeVisible()
await expect(morePage.nameWrapperStatus).toContainText('Wrapped')
await expect(morePage.pccStatus).toContainText('Parent-controllable')
await expect(morePage.nameWrapperCheckIcon).toBeVisible()
await expect(morePage.nameWrapperLockIcon).not.toBeVisible()
await expect(morePage.pccIcon).toBeVisible()
await expect(morePage.nameWrapperLockIcon).not.toBeVisible()
})

test('Wrapped, emancipated(NPC), 3LD', async ({ login, makeName, makePageObject }) => {
const name = await makeName({
label: 'wrapped',
type: 'wrapped',
owner: 'user',
fuses: {
named: ['CANNOT_UNWRAP'],
},
subnames: [
{
label: 'test',
owner: 'user',
fuses: {
parent: {
named: ['PARENT_CANNOT_CONTROL'],
},
},
},
],
})

const morePage = makePageObject('MorePage')
await morePage.goto(`test.${name}`)

await login.connect()

await expect(morePage.unwrapButton).toBeVisible()
await expect(morePage.nameWrapperStatus).toContainText('Wrapped')
await expect(morePage.pccStatus).toContainText('Not parent-controllable')
await expect(morePage.nameWrapperCheckIcon).toBeVisible()
await expect(morePage.npcIcon).toBeVisible()
await expect(morePage.nameWrapperLockIcon).not.toBeVisible()
})

test('Wrapped, emancipated(NPC), Locked, 3LD', async ({ login, makeName, makePageObject }) => {
const name = await makeName({
label: 'wrapped',
type: 'wrapped',
owner: 'user',
fuses: {
named: ['CANNOT_UNWRAP'],
},
subnames: [
{
label: 'test',
owner: 'user',
fuses: {
parent: {
named: ['PARENT_CANNOT_CONTROL'],
},
child: {
named: ['CANNOT_UNWRAP'],
},
},
},
],
})

const morePage = makePageObject('MorePage')
await morePage.goto(`test.${name}`)

await login.connect()

await expect(morePage.nameWrapperStatus).toContainText('Wrapped')
await expect(morePage.pccStatus).toContainText('Not parent-controllable')
await expect(morePage.nameWrapperLockIcon).toBeVisible()
await expect(morePage.npcIcon).toBeVisible()
await expect(morePage.unwrapButtonDisabled).toBeVisible()
})

test('Wrapped, emancipated(NPC), 3LD Manager', async ({ login, makeName, makePageObject }) => {
const name = await makeName({
label: 'wrapped',
type: 'wrapped',
owner: 'user2',
fuses: {
named: ['CANNOT_UNWRAP'],
},
subnames: [
{
label: 'test',
owner: 'user',
fuses: {
parent: {
named: ['PARENT_CANNOT_CONTROL'],
},
},
},
],
})

const morePage = makePageObject('MorePage')
const transactionModal = makePageObject('TransactionModal')
await morePage.goto(`test.${name}`)

await login.connect()

await expect(morePage.unwrapButton).toBeVisible()
await expect(morePage.nameWrapperStatus).toContainText('Wrapped')
await expect(morePage.pccStatus).toContainText('Not parent-controllable')
await expect(morePage.nameWrapperCheckIcon).toBeVisible()
await expect(morePage.npcIcon).toBeVisible()
await expect(morePage.nameWrapperLockIcon).not.toBeVisible()

await morePage.unwrapButton.click()
await transactionModal.autoComplete()
await expect(morePage.wrapButton).toBeVisible()
})
2 changes: 1 addition & 1 deletion functions/_middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ const firefoxRewrite: PagesFunction = async ({ request, next }) => {
// default headers
response.headers.set(
'Content-Security-Policy',
"worker-src 'self'; script-src 'self' 'sha256-UyYcl+sKCF/ROFZPHBlozJrndwfNiC5KT5ZZfup/pPc=' https://*.googletagmanager.com plausible.io static.cloudflareinsights.com *.ens-app-v3.pages.dev https://app.intercom.io https://widget.intercom.io https://js.intercomcdn.com 'wasm-unsafe-eval'; frame-ancestors 'self' https://app.safe.global;",
"worker-src 'self'; script-src 'self' 'sha256-UyYcl+sKCF/ROFZPHBlozJrndwfNiC5KT5ZZfup/pPc=' plausible.io static.cloudflareinsights.com *.ens-app-v3.pages.dev https://app.intercom.io https://widget.intercom.io https://js.intercomcdn.com 'wasm-unsafe-eval'; frame-ancestors 'self' https://app.safe.global;",
)
return response
}
Expand Down
30 changes: 30 additions & 0 deletions knip.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import type { KnipConfig } from 'knip'

const config: KnipConfig = {
project: ['src/**/*.{js,jsx,ts,tsx,mjs,mts}'],
include: ['files', 'duplicates'],
exclude: ['types', 'exports', 'unlisted'],
next: {
entry: ['next.config.{js,ts,cjs,mjs}', 'src/pages/**/*.{js,jsx,ts,tsx}'],
},
playwright: {
config: ['playwright.config.{js,ts}'],
entry: ['e2e/**/*.@(spec|test).?(c|m)[jt]s?(x)'],
},
vitest: {
config: ['vitest.config.{js,mjs,ts,cjs,mts,cts}'],
entry: ['src/**/*.test.{js,ts,jsx,tsx}'],
},
ignore: [
// Duplicate exports. Removal is currently blocked due to potential E2E test failures.
'src/transaction-flow/input/EditResolver/EditResolver-flow.tsx',
'src/utils/metamask/firefox.ts',
// We still need the `test-d` files
'src/hooks/ensjs/public/useRecords.test-d.ts',
'src/utils/query/match/matchExactOrNullParamItem.test-d.ts',
'src/utils/query/match/matchQueryKeyMeta.test-d.ts',
'src/utils/query/match/queryKeyToInternalParams.test-d.ts',
],
}

export default config
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@
"generate:sitemaps": "node ./scripts/generate-site-map.mjs",
"generate:coinMapper": "ts-node ./scripts/coin-mapper.ts",
"compose": "cp ./node_modules/@ensdomains/ens-test-env/src/docker-compose.yml ./docker-compose.yml",
"subgraph:update": "ens-test-env subgraph --var NEXT_PUBLIC_DEPLOYMENT_ADDRESSES"
"subgraph:update": "ens-test-env subgraph --var NEXT_PUBLIC_DEPLOYMENT_ADDRESSES",
"knip": "npx knip",
"knip:fix": "npx knip --fix --allow-remove-files"
},
"dependencies": {
"@ensdomains/address-encoder": "1.1.1",
Expand Down Expand Up @@ -159,6 +161,7 @@
"husky": "^7.0.4",
"isows": "^1.0.3",
"jsdom": "^24.0.0",
"knip": "^5.27.2",
"lokijs": "^1.5.12",
"msw": "^1.2.3",
"multiformats": "^12.0.1",
Expand Down
21 changes: 21 additions & 0 deletions playwright/pageObjects/morePage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,20 @@ export class MorePage {

readonly unwrapButton: Locator

readonly pccStatus: Locator

readonly nameWrapperStatus: Locator

readonly unwrapButtonDisabled: Locator

readonly nameWrapperLockIcon: Locator

readonly nameWrapperCheckIcon: Locator

readonly npcIcon: Locator

readonly pccIcon: Locator

constructor(page: Page) {
this.page = page
this.getSendNameButton = this.page.getByTestId('send-name-button')
Expand All @@ -30,6 +44,13 @@ export class MorePage {
this.resolver = this.page.getByTestId('name-details-text')
this.wrapButton = this.page.getByTestId('wrap-name-btn')
this.unwrapButton = this.page.getByTestId('unwrap-name-btn')
this.pccStatus = this.page.getByTestId('pcc-status')
this.nameWrapperStatus = this.page.getByTestId('namewrapper-status')
this.unwrapButtonDisabled = this.page.getByTestId('cannot-unwrap-disabled-button')
this.nameWrapperLockIcon = this.page.getByTestId('namewrapper-lock-icon')
this.nameWrapperCheckIcon = this.page.getByTestId('namewrapper-check-icon')
this.npcIcon = this.page.getByTestId('npc-icon')
this.pccIcon = this.page.getByTestId('pcc-icon')
}

async goto(name: string) {
Expand Down
Loading

0 comments on commit dddb614

Please sign in to comment.