tauri/tooling/create-tauri-app/test/index.spec.ts
Jacob Bolda af6411d5f8
feat: setup testing for CTA (#1615)
* feat: setup testing for CTA

* install with yarn

* build before test

* add yarn to npm runs for install / test start

* add dev mode to link cli.js and api locally

* remove fixtures

* run tests serially

* cli.js build-release avoids webpack error

* assert on package.json contents as first check

* run tauri build and split out custom asserts

* add changefile

* shorten workflow name

* too short

* exclude npm@6 on node@16

* increase timeout, tauri build takes a bit of time

* only assert that the tauri script exists
2021-04-27 09:14:24 -05:00

162 lines
4.5 KiB
TypeScript

// Copyright 2019-2021 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import execa from 'execa'
import fixtures from 'fixturez'
const f = fixtures(__dirname)
import path from 'path'
import fs from 'fs'
const ctaBinary = path.resolve('./bin/create-tauri-app.js')
const clijs = path.resolve('../cli.js/')
const api = path.resolve('../api/')
const manager = process.env.TAURI_RUN_MANAGER ?? 'npm'
const recipes = process.env.TAURI_RECIPE
? [process.env.TAURI_RECIPE]
: ['vanillajs', 'reactjs', 'reactts', 'vite', 'vuecli']
const timeoutLong = 900000
const timeoutLittleLonger = 930000
const logOut = false ? 'inherit' : 'pipe'
beforeAll(async () => {
const installCLI = await execa('yarn', [], {
stdio: logOut,
cwd: clijs,
timeout: timeoutLong
})
const buildCLI = await execa('yarn', ['build-release'], {
stdio: logOut,
cwd: clijs,
timeout: timeoutLong
})
const linkCLI = await execa('yarn', ['link'], {
stdio: logOut,
cwd: clijs,
timeout: timeoutLong
})
const installAPI = await execa('yarn', [], {
stdio: logOut,
cwd: api,
timeout: timeoutLong
})
const buildAPI = await execa('yarn', ['build'], {
stdio: logOut,
cwd: api,
timeout: timeoutLong
})
const linkAPI = await execa('yarn', ['link'], {
stdio: logOut,
cwd: api,
timeout: timeoutLong
})
}, timeoutLittleLonger)
describe('CTA', () => {
describe.each(recipes.map((recipe) => [recipe, 'tauri-app']))(
`%s recipe`,
(recipe: string, appName: string) => {
it(
'runs',
async () => {
// creates a temp folder to run CTA within (this is our cwd)
const folder = f.temp()
const appFolder = path.join(folder, appName)
// runs CTA with all args set to avoid any prompts
const cta = await execa(
'node',
[
ctaBinary,
'--manager',
manager,
'--recipe',
recipe,
'--ci',
'--dev'
],
{
all: true,
stdio: logOut,
cwd: folder,
timeout: timeoutLong
}
)
// check to make certain it didn't fail anywhere
expect(cta.failed).toBe(false)
expect(cta.timedOut).toBe(false)
expect(cta.isCanceled).toBe(false)
expect(cta.killed).toBe(false)
expect(cta.signal).toBe(undefined)
// run a tauri build to check if what we produced
// can actually create an app
// TODO long term we will want to hook this up to a real test harness
// and then run that test suite instead
let opts: string[] = []
if (manager === 'npm') {
opts = ['run', 'tauri', '--', 'build']
} else if (manager === 'yarn') {
opts = ['tauri', 'build']
}
const tauriBuild = await execa(manager, opts, {
all: true,
stdio: logOut,
cwd: appFolder,
timeout: timeoutLong
})
expect(tauriBuild.failed).toBe(false)
expect(tauriBuild.timedOut).toBe(false)
expect(tauriBuild.isCanceled).toBe(false)
expect(tauriBuild.killed).toBe(false)
expect(tauriBuild.signal).toBe(undefined)
const packageFileOutput: {
[k: string]: string | object
} = JSON.parse(
await fs.promises.readFile(
path.join(appFolder, 'package.json'),
'utf-8'
)
)
expect(packageFileOutput['name']).toBe(appName)
const assertCustom: { [k: string]: Function } = {
vanillajs: () => {
expect(packageFileOutput['scripts']).toMatchObject({
tauri: 'tauri'
})
},
reactjs: () => {
expect(packageFileOutput['scripts']).toEqual(
expect.objectContaining({
tauri: 'tauri'
})
)
},
reactts: () => {
expect(packageFileOutput['scripts']).toEqual(
expect.objectContaining({
tauri: 'tauri'
})
)
}
}
const getCustomAsserts = assertCustom[recipe]
if (getCustomAsserts) getCustomAsserts()
},
timeoutLittleLonger
)
}
)
})