Skip to content

Commit 0f1e85f

Browse files
test: serialize packed package integration checks
1 parent c4d577f commit 0f1e85f

3 files changed

Lines changed: 121 additions & 102 deletions

File tree

tests/create-arrow-js.spec.ts

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
scaffoldArrowApp,
1111
} from '../packages/create-arrow-js/scaffold.js'
1212
import { getPackedWorkspacePackages } from './helpers/packed-workspace-packages.js'
13+
import { withWorkspaceIntegrationLock } from './helpers/workspace-build-lock.js'
1314

1415
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
1516
const arrowPackages = [
@@ -202,23 +203,25 @@ describe('create-arrow-js', () => {
202203
const projectDir = path.resolve(workspace, 'arrow-app')
203204
const packDir = path.resolve(workspace, 'packs')
204205

205-
await scaffoldArrowApp(projectDir)
206-
await fs.mkdir(packDir, { recursive: true })
207-
const tarballs = await getPackedWorkspacePackages(arrowPackages, packDir)
208-
209-
await rewriteArrowDependencies(projectDir, tarballs)
210-
211-
await execa('pnpm', ['install', '--prefer-offline'], {
212-
cwd: projectDir,
213-
})
214-
await execa('pnpm', ['typecheck'], {
215-
cwd: projectDir,
216-
})
217-
await execa('pnpm', ['build'], {
218-
cwd: projectDir,
206+
await withWorkspaceIntegrationLock(async () => {
207+
await scaffoldArrowApp(projectDir)
208+
await fs.mkdir(packDir, { recursive: true })
209+
const tarballs = await getPackedWorkspacePackages(arrowPackages, packDir)
210+
211+
await rewriteArrowDependencies(projectDir, tarballs)
212+
213+
await execa('pnpm', ['install', '--prefer-offline'], {
214+
cwd: projectDir,
215+
})
216+
await execa('pnpm', ['typecheck'], {
217+
cwd: projectDir,
218+
})
219+
await execa('pnpm', ['build'], {
220+
cwd: projectDir,
221+
})
219222
})
220223
},
221-
90_000
224+
150_000
222225
)
223226
})
224227

tests/helpers/workspace-build-lock.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,35 @@ const repoRoot = path.resolve(
1111
)
1212
const workspaceKey = createHash('sha1').update(repoRoot).digest('hex').slice(0, 12)
1313
const lockDir = path.resolve(os.tmpdir(), `arrow-workspace-tests-${workspaceKey}`, 'workspace-build-lock')
14+
const integrationLockDir = path.resolve(
15+
os.tmpdir(),
16+
`arrow-workspace-tests-${workspaceKey}`,
17+
'workspace-integration-lock'
18+
)
1419

1520
export async function withWorkspaceBuildLock<T>(fn: () => Promise<T>) {
16-
await fs.mkdir(path.dirname(lockDir), { recursive: true })
17-
await acquireLock()
21+
return withLock(lockDir, fn)
22+
}
23+
24+
export async function withWorkspaceIntegrationLock<T>(fn: () => Promise<T>) {
25+
return withLock(integrationLockDir, fn)
26+
}
27+
28+
async function withLock<T>(targetLockDir: string, fn: () => Promise<T>) {
29+
await fs.mkdir(path.dirname(targetLockDir), { recursive: true })
30+
await acquireLock(targetLockDir)
1831

1932
try {
2033
return await fn()
2134
} finally {
22-
await fs.rm(lockDir, { force: true, recursive: true })
35+
await fs.rm(targetLockDir, { force: true, recursive: true })
2336
}
2437
}
2538

26-
async function acquireLock() {
39+
async function acquireLock(targetLockDir: string) {
2740
while (true) {
2841
try {
29-
await fs.mkdir(lockDir)
42+
await fs.mkdir(targetLockDir)
3043
return
3144
} catch (error) {
3245
if (!(error instanceof Error) || !('code' in error) || error.code !== 'EEXIST') {

tests/package-exports.spec.ts

Lines changed: 85 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import path from 'node:path'
44
import { execa } from 'execa'
55
import { afterEach, describe, expect, it } from 'vitest'
66
import { getPackedWorkspacePackages } from './helpers/packed-workspace-packages.js'
7+
import { withWorkspaceIntegrationLock } from './helpers/workspace-build-lock.js'
78

89
const packagedArrowLibraries = [
910
'@arrow-js/core',
@@ -30,105 +31,107 @@ describe('packaged Arrow exports', () => {
3031
const packDir = path.resolve(workspace, 'packs')
3132
const consumerDir = path.resolve(workspace, 'consumer')
3233

33-
await fs.mkdir(packDir, { recursive: true })
34-
await fs.mkdir(consumerDir, { recursive: true })
35-
const tarballs = await getPackedWorkspacePackages(
36-
packagedArrowLibraries,
37-
packDir
38-
)
34+
await withWorkspaceIntegrationLock(async () => {
35+
await fs.mkdir(packDir, { recursive: true })
36+
await fs.mkdir(consumerDir, { recursive: true })
37+
const tarballs = await getPackedWorkspacePackages(
38+
packagedArrowLibraries,
39+
packDir
40+
)
3941

40-
await fs.writeFile(
41-
path.resolve(consumerDir, 'package.json'),
42-
`${JSON.stringify({
43-
name: 'arrow-package-smoke',
44-
private: true,
45-
type: 'module',
46-
dependencies: Object.fromEntries(
47-
packagedArrowLibraries.map((packageName) => [
48-
packageName,
49-
`file:${normalizePath(tarballs[packageName])}`,
50-
])
51-
),
52-
pnpm: {
53-
overrides: Object.fromEntries(
42+
await fs.writeFile(
43+
path.resolve(consumerDir, 'package.json'),
44+
`${JSON.stringify({
45+
name: 'arrow-package-smoke',
46+
private: true,
47+
type: 'module',
48+
dependencies: Object.fromEntries(
5449
packagedArrowLibraries.map((packageName) => [
5550
packageName,
5651
`file:${normalizePath(tarballs[packageName])}`,
5752
])
5853
),
59-
},
60-
}, null, 2)}\n`
61-
)
54+
pnpm: {
55+
overrides: Object.fromEntries(
56+
packagedArrowLibraries.map((packageName) => [
57+
packageName,
58+
`file:${normalizePath(tarballs[packageName])}`,
59+
])
60+
),
61+
},
62+
}, null, 2)}\n`
63+
)
6264

63-
await execa('pnpm', ['install', '--prefer-offline'], {
64-
cwd: consumerDir,
65-
})
65+
await execa('pnpm', ['install', '--prefer-offline'], {
66+
cwd: consumerDir,
67+
})
6668

67-
const verifyScriptPath = path.resolve(consumerDir, 'verify.mjs')
68-
await fs.writeFile(
69-
verifyScriptPath,
70-
[
71-
"const [{ component, html }] = await Promise.all([",
72-
" import('@arrow-js/core'),",
73-
" import('@arrow-js/core/internal'),",
74-
" import('@arrow-js/framework'),",
75-
" import('@arrow-js/framework/internal'),",
76-
" import('@arrow-js/framework/ssr'),",
77-
" import('@arrow-js/ssr'),",
78-
" import('@arrow-js/hydrate'),",
79-
" import('@arrow-js/highlight'),",
80-
'])',
81-
'component(async () => html`<p>ok</p>`)',
82-
"console.log('imports ok')",
83-
'',
84-
].join('\n')
85-
)
69+
const verifyScriptPath = path.resolve(consumerDir, 'verify.mjs')
70+
await fs.writeFile(
71+
verifyScriptPath,
72+
[
73+
"const [{ component, html }] = await Promise.all([",
74+
" import('@arrow-js/core'),",
75+
" import('@arrow-js/core/internal'),",
76+
" import('@arrow-js/framework'),",
77+
" import('@arrow-js/framework/internal'),",
78+
" import('@arrow-js/framework/ssr'),",
79+
" import('@arrow-js/ssr'),",
80+
" import('@arrow-js/hydrate'),",
81+
" import('@arrow-js/highlight'),",
82+
'])',
83+
'component(async () => html`<p>ok</p>`)',
84+
"console.log('imports ok')",
85+
'',
86+
].join('\n')
87+
)
8688

87-
const { stdout } = await execa('node', [verifyScriptPath], {
88-
cwd: consumerDir,
89-
})
89+
const { stdout } = await execa('node', [verifyScriptPath], {
90+
cwd: consumerDir,
91+
})
9092

91-
const frameworkPackage = JSON.parse(
92-
await fs.readFile(
93-
path.resolve(consumerDir, 'node_modules/@arrow-js/framework/package.json'),
94-
'utf8'
93+
const frameworkPackage = JSON.parse(
94+
await fs.readFile(
95+
path.resolve(consumerDir, 'node_modules/@arrow-js/framework/package.json'),
96+
'utf8'
97+
)
9598
)
96-
)
97-
const corePackage = JSON.parse(
98-
await fs.readFile(
99-
path.resolve(consumerDir, 'node_modules/@arrow-js/core/package.json'),
100-
'utf8'
99+
const corePackage = JSON.parse(
100+
await fs.readFile(
101+
path.resolve(consumerDir, 'node_modules/@arrow-js/core/package.json'),
102+
'utf8'
103+
)
101104
)
102-
)
103-
const ssrPackage = JSON.parse(
104-
await fs.readFile(
105-
path.resolve(consumerDir, 'node_modules/@arrow-js/ssr/package.json'),
106-
'utf8'
105+
const ssrPackage = JSON.parse(
106+
await fs.readFile(
107+
path.resolve(consumerDir, 'node_modules/@arrow-js/ssr/package.json'),
108+
'utf8'
109+
)
107110
)
108-
)
109-
const hydratePackage = JSON.parse(
110-
await fs.readFile(
111-
path.resolve(consumerDir, 'node_modules/@arrow-js/hydrate/package.json'),
112-
'utf8'
111+
const hydratePackage = JSON.parse(
112+
await fs.readFile(
113+
path.resolve(consumerDir, 'node_modules/@arrow-js/hydrate/package.json'),
114+
'utf8'
115+
)
113116
)
114-
)
115-
const highlightPackage = JSON.parse(
116-
await fs.readFile(
117-
path.resolve(consumerDir, 'node_modules/@arrow-js/highlight/package.json'),
118-
'utf8'
117+
const highlightPackage = JSON.parse(
118+
await fs.readFile(
119+
path.resolve(consumerDir, 'node_modules/@arrow-js/highlight/package.json'),
120+
'utf8'
121+
)
119122
)
120-
)
121123

122-
expect(stdout).toContain('imports ok')
123-
expect(corePackage.exports['./internal'].import).toBe('./dist/internal.mjs')
124-
expect(frameworkPackage.exports['.'].import).toBe('./dist/index.mjs')
125-
expect(frameworkPackage.exports['./internal'].import).toBe('./dist/internal.mjs')
126-
expect(frameworkPackage.exports['./ssr'].import).toBe('./dist/ssr.mjs')
127-
expect(ssrPackage.exports['.'].import).toBe('./dist/index.mjs')
128-
expect(hydratePackage.exports['.'].import).toBe('./dist/index.mjs')
129-
expect(highlightPackage.exports['.'].import).toBe('./dist/index.mjs')
124+
expect(stdout).toContain('imports ok')
125+
expect(corePackage.exports['./internal'].import).toBe('./dist/internal.mjs')
126+
expect(frameworkPackage.exports['.'].import).toBe('./dist/index.mjs')
127+
expect(frameworkPackage.exports['./internal'].import).toBe('./dist/internal.mjs')
128+
expect(frameworkPackage.exports['./ssr'].import).toBe('./dist/ssr.mjs')
129+
expect(ssrPackage.exports['.'].import).toBe('./dist/index.mjs')
130+
expect(hydratePackage.exports['.'].import).toBe('./dist/index.mjs')
131+
expect(highlightPackage.exports['.'].import).toBe('./dist/index.mjs')
132+
})
130133
},
131-
90_000
134+
150_000
132135
)
133136
})
134137

0 commit comments

Comments
 (0)