Skip to content

Commit 62d517e

Browse files
authored
Merge branch 'master' into feat-add-unstoppable-domains-to-lookup-domains
2 parents f673c20 + 1f23168 commit 62d517e

8 files changed

Lines changed: 347 additions & 258 deletions

File tree

.github/workflows/create-sentry-release.yml

Lines changed: 0 additions & 11 deletions
This file was deleted.

jest.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default {
1313

1414
preset: 'ts-jest',
1515
testEnvironment: 'node',
16-
setupFiles: ['dotenv/config'],
16+
setupFiles: ['<rootDir>/test/setup-dotenv.ts'],
1717
setupFilesAfterEnv: ['<rootDir>/test/setup-jest.ts'],
1818
testPathIgnorePatterns: ['/node_modules/', '<rootDir>/dist/', '<rootDir>/test/fixtures/'],
1919
moduleFileExtensions: ['js', 'ts'],

package.json

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@
1010
"build": "tsc",
1111
"dev": "nodemon src/index.ts",
1212
"start": "node dist/src/index.js",
13-
"start:test": "dotenv -e test/.env.test yarn dev",
14-
"test": "PORT=3003 start-server-and-test 'yarn start:test' http://localhost:3003 'dotenv -e test/.env.test yarn jest'",
15-
"test:integration": "dotenv -e test/.env.test yarn jest --runInBand --collectCoverage=false test/integration",
16-
"test:e2e": "PORT=3003 start-server-and-test 'yarn start:test' http://localhost:3003 'dotenv -e test/.env.test jest --runInBand --collectCoverage=false test/e2e/'"
13+
"test": "jest",
14+
"test:integration": "jest --runInBand --collectCoverage=false --forceExit test/integration",
15+
"test:e2e": "jest --runInBand --collectCoverage=false --forceExit test/e2e/"
1716
},
1817
"dependencies": {
1918
"@adraffy/ens-normalize": "^1.10.0",
@@ -35,7 +34,6 @@
3534
"compression": "^1.7.4",
3635
"cors": "^2.8.5",
3736
"dotenv": "^16.0.0",
38-
"dotenv-cli": "^7.3.0",
3937
"eslint": "^6.7.2",
4038
"express": "^4.17.1",
4139
"jsdom": "^19.0.0",
@@ -51,12 +49,13 @@
5149
"@types/express": "^4.17.11",
5250
"@types/jest": "^28.1.0",
5351
"@types/node": "^14.14.21",
52+
"@types/supertest": "^6.0.3",
5453
"@typescript-eslint/eslint-plugin": "^2.33.0",
5554
"@typescript-eslint/parser": "^2.33.0",
5655
"eslint-plugin-prettier": "^3.1.3",
5756
"jest": "^28.1.0",
5857
"prettier": "^1.19.1",
59-
"start-server-and-test": "^2.0.3",
58+
"supertest": "^7.1.3",
6059
"ts-jest": "^28.0.4"
6160
}
6261
}

test/e2e/api.test.ts

Lines changed: 56 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import axios from 'axios';
2-
import fetch from 'node-fetch';
1+
import request from 'supertest';
32
import redis from '../../src/helpers/redis';
43
import { KEY_PREFIX } from '../../src/addressResolvers/cache';
4+
import { createTestApp } from '../helpers/testServer';
55

6-
const HOST = `http://localhost:${process.env.PORT || 3003}`;
6+
const app = createTestApp();
7+
let server: any;
78

89
async function purge(): Promise<void> {
910
if (!redis) return;
@@ -15,14 +16,26 @@ async function purge(): Promise<void> {
1516
transaction.exec();
1617
}
1718

18-
async function imageToBase64(url: string) {
19-
const response = await fetch(url);
20-
const buffer = await response.buffer();
21-
22-
return buffer.toString('base64');
23-
}
24-
2519
describe('E2E api', () => {
20+
beforeAll(async () => {
21+
server = app.listen(0); // Use port 0 to get a random available port
22+
});
23+
24+
afterAll(async () => {
25+
if (server) {
26+
// Force close all connections if available
27+
if (server.closeAllConnections) {
28+
server.closeAllConnections();
29+
}
30+
await new Promise<void>((resolve, reject) => {
31+
server.close((err: any) => {
32+
if (err) reject(err);
33+
else resolve();
34+
});
35+
});
36+
server = null;
37+
}
38+
});
2639
describe('GET type/TYPE/ID', () => {
2740
it.todo('returns a 500 status on invalid query');
2841

@@ -32,45 +45,43 @@ describe('E2E api', () => {
3245
it.todo('caches the resized image');
3346

3447
it('returns same space avatar for snapshot legacy and non-legacy format', async () => {
35-
expect(await imageToBase64(`${HOST}/space/ens.eth`)).toEqual(
36-
await imageToBase64(`${HOST}/space/s:ens.eth`)
48+
const response1 = await request(server).get('/space/ens.eth');
49+
const response2 = await request(server).get('/space/s:ens.eth');
50+
expect(response1.body.toString('base64')).toEqual(response2.body.toString('base64'));
51+
52+
const response3 = await request(server).get(
53+
'/space/sn:0x07c251045154318a2376a3bb65be47d3c90df1740d8e35c9b9d943aa3f240e50'
3754
);
38-
expect(
39-
await imageToBase64(
40-
`${HOST}/space/sn:0x07c251045154318a2376a3bb65be47d3c90df1740d8e35c9b9d943aa3f240e50`
41-
)
42-
).toEqual(
43-
await imageToBase64(
44-
`${HOST}/space-sx/0x07c251045154318a2376a3bb65be47d3c90df1740d8e35c9b9d943aa3f240e50`
45-
)
55+
const response4 = await request(server).get(
56+
'/space-sx/0x07c251045154318a2376a3bb65be47d3c90df1740d8e35c9b9d943aa3f240e50'
4657
);
58+
expect(response3.body.toString('base64')).toEqual(response4.body.toString('base64'));
4759
});
4860

4961
it('returns different space avatar for different network', async () => {
50-
expect(await imageToBase64(`${HOST}/space/s:ens.eth`)).not.toEqual(
51-
await imageToBase64(`${HOST}/space/s-tn:ens.eth`)
52-
);
62+
const response1 = await request(server).get('/space/s:ens.eth');
63+
const response2 = await request(server).get('/space/s-tn:ens.eth');
64+
expect(response1.body.toString('base64')).not.toEqual(response2.body.toString('base64'));
5365
});
5466

5567
it('returns same space cover for snapshot legacy and non-legacy format', async () => {
56-
expect(await imageToBase64(`${HOST}/space-cover/test.wa0x6e.eth`)).toEqual(
57-
await imageToBase64(`${HOST}/space-cover/s:test.wa0x6e.eth`)
68+
const response1 = await request(server).get('/space-cover/test.wa0x6e.eth');
69+
const response2 = await request(server).get('/space-cover/s:test.wa0x6e.eth');
70+
expect(response1.body.toString('base64')).toEqual(response2.body.toString('base64'));
71+
72+
const response3 = await request(server).get(
73+
'/space-cover/sn:0x07c251045154318a2376a3bb65be47d3c90df1740d8e35c9b9d943aa3f240e50'
5874
);
59-
expect(
60-
await imageToBase64(
61-
`${HOST}/space-cover/sn:0x07c251045154318a2376a3bb65be47d3c90df1740d8e35c9b9d943aa3f240e50`
62-
)
63-
).toEqual(
64-
await imageToBase64(
65-
`${HOST}/space-cover-sx/0x07c251045154318a2376a3bb65be47d3c90df1740d8e35c9b9d943aa3f240e50`
66-
)
75+
const response4 = await request(server).get(
76+
'/space-cover-sx/0x07c251045154318a2376a3bb65be47d3c90df1740d8e35c9b9d943aa3f240e50'
6777
);
78+
expect(response3.body.toString('base64')).toEqual(response4.body.toString('base64'));
6879
});
6980

7081
it('returns different space cover for different network', async () => {
71-
expect(await imageToBase64(`${HOST}/space-cover/s:test.wa0x6e.eth`)).not.toEqual(
72-
await imageToBase64(`${HOST}/space-cover/s-tn:test.wa0x6e.eth`)
73-
);
82+
const response1 = await request(server).get('/space-cover/s:test.wa0x6e.eth');
83+
const response2 = await request(server).get('/space-cover/s-tn:test.wa0x6e.eth');
84+
expect(response1.body.toString('base64')).not.toEqual(response2.body.toString('base64'));
7485
});
7586
});
7687

@@ -101,12 +112,9 @@ describe('E2E api', () => {
101112

102113
describe('on lookup_addresses', () => {
103114
function fetchLookupAddresses(params: any) {
104-
return axios({
105-
url: HOST,
106-
method: 'POST',
107-
responseType: 'json',
108-
data: { method: 'lookup_addresses', params }
109-
});
115+
return request(server)
116+
.post('/')
117+
.send({ method: 'lookup_addresses', params });
110118
}
111119

112120
describe('when not passing an array as params', () => {
@@ -119,8 +127,9 @@ describe('E2E api', () => {
119127
['a boolean', true]
120128
];
121129
// @ts-ignore
122-
it.each(tests)('returns an error when passing %s', async (title: string, params: any) => {
123-
expect(fetchLookupAddresses(params)).rejects.toThrowError(/status code 400/);
130+
it.each(tests)('returns an error when passing %s', async (_: string, params: any) => {
131+
const response = await fetchLookupAddresses(params);
132+
expect(response.status).toBe(400);
124133
});
125134
});
126135

@@ -133,7 +142,7 @@ describe('E2E api', () => {
133142
]);
134143

135144
expect(response.status).toBe(200);
136-
expect(response.data.result).toEqual({
145+
expect(response.body.result).toEqual({
137146
'0xE6D0Dd18C6C3a9Af8C2FaB57d6e6A38E29d513cC': 'sdntestens.eth',
138147
'0xe6d0dd18c6c3a9af8c2fab57d6e6a38e29d513cc': 'sdntestens.eth'
139148
});
@@ -149,7 +158,7 @@ describe('E2E api', () => {
149158
]);
150159

151160
expect(response.status).toBe(200);
152-
expect(response.data.result).toEqual({
161+
expect(response.body.result).toEqual({
153162
'0x07FF6B17F07C4D83236E3FC5F94259A19D1ED41BBCF1822397EA17882E9B038D': 'Checkpoint',
154163
'0x07ff6b17f07c4d83236e3fc5f94259a19d1ed41bbcf1822397ea17882e9b038d': 'Checkpoint'
155164
});
@@ -167,7 +176,7 @@ describe('E2E api', () => {
167176
]);
168177

169178
expect(response.status).toBe(200);
170-
expect(response.data.result).toEqual({
179+
expect(response.body.result).toEqual({
171180
'0x07FF6B17F07C4D83236E3FC5F94259A19D1ED41BBCF1822397EA17882E9B038D': 'Checkpoint',
172181
'0x07ff6b17f07c4d83236e3fc5f94259a19d1ed41bbcf1822397ea17882e9b038d': 'Checkpoint',
173182
'0xE6D0Dd18C6C3a9Af8C2FaB57d6e6A38E29d513cC': 'sdntestens.eth',

test/helpers/testServer.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import express from 'express';
2+
import cors from 'cors';
3+
import api from '../../src/api';
4+
5+
export function createTestApp(): express.Application {
6+
const app = express();
7+
8+
app.use(express.json({ limit: '4mb' }));
9+
app.use(express.urlencoded({ limit: '4mb', extended: false }));
10+
app.use(cors({ maxAge: 86400 }));
11+
app.use('/', api);
12+
13+
return app;
14+
}

test/setup-dotenv.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import dotenv from 'dotenv';
2+
import path from 'path';
3+
4+
// Load .env file from root
5+
dotenv.config({ path: path.resolve(__dirname, '../.env') });
6+
7+
// Load .env.test file from test directory (overwrites any duplicate keys)
8+
dotenv.config({ path: path.resolve(__dirname, '.env.test'), override: true });

test/setup-jest.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import client from '../src/helpers/redis';
55

66
afterAll(async () => {
77
if (client) {
8-
await client.flushDb();
9-
await client.quit();
8+
try {
9+
await client.flushDb();
10+
await client.quit();
11+
} catch (error) {
12+
// Ignore errors during cleanup
13+
}
1014
}
1115
});

0 commit comments

Comments
 (0)