Skip to content

Commit d9dfdec

Browse files
committed
fix(ct): run vite server once on init
1 parent 397a961 commit d9dfdec

File tree

10 files changed

+209
-251
lines changed

10 files changed

+209
-251
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../build/src/browser/client-scripts/bundle.compat.js
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../build/src/browser/client-scripts/bundle.native.js

src/runner/browser-env/index.ts

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

src/runner/browser-env/vite/server.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import { plugin as generateIndexHtml } from "./plugins/generate-index-html";
1313
import { plugin as mockPlugin } from "./plugins/mock";
1414
import { ManualMock } from "./manual-mock";
1515
import { Config } from "../../../config";
16+
import RuntimeConfig from "../../../config/runtime-config";
1617
import { VITE_DEFAULT_CONFIG_ENV } from "./constants";
18+
import defaults from "../../../config/defaults";
1719

1820
import type { ViteDevServer, UserConfig, InlineConfig } from "vite";
1921
import type { BrowserTestRunEnvOptions } from "./types";
@@ -76,6 +78,8 @@ export class ViteServer {
7678

7779
await this._server.listen();
7880

81+
this._useBaseUrlFromVite();
82+
7983
logger.log(chalk.green(`Vite server started on ${this.baseUrl}`));
8084
}
8185

@@ -115,4 +119,21 @@ export class ViteServer {
115119
get baseUrl(): string | undefined {
116120
return this._server?.resolvedUrls!.local[0];
117121
}
122+
123+
private _useBaseUrlFromVite(): void {
124+
const viteBaseUrl = this.baseUrl!;
125+
const defaultBaseUrl = defaults.baseUrl;
126+
127+
RuntimeConfig.getInstance().extend({ viteBaseUrl });
128+
129+
if (this._testplaneConfig.baseUrl === defaultBaseUrl) {
130+
this._testplaneConfig.baseUrl = viteBaseUrl;
131+
}
132+
133+
for (const broConfig of Object.values(this._testplaneConfig.browsers)) {
134+
if (broConfig.baseUrl === defaultBaseUrl) {
135+
broConfig.baseUrl = viteBaseUrl;
136+
}
137+
}
138+
}
118139
}

src/testplane.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ import _ from "lodash";
33
import fs from "fs-extra";
44
import { Stats as RunnerStats } from "./stats";
55
import { BaseTestplane } from "./base-testplane";
6-
import type { MainRunner as NodejsEnvRunner } from "./runner";
7-
import type { MainRunner as BrowserEnvRunner } from "./runner/browser-env";
6+
import type { MainRunner } from "./runner";
87
import RuntimeConfig from "./config/runtime-config";
98
import { MasterAsyncEvents, MasterEvents, MasterSyncEvents } from "./events";
109
import eventsUtils from "./events/utils";
@@ -19,6 +18,7 @@ import { initDevServer } from "./dev-server";
1918
import { ConfigInput } from "./config/types";
2019
import { MasterEventHandler, Test, TestResult } from "./types";
2120
import { preloadWebdriverIO } from "./utils/preload-utils";
21+
import { ViteServer } from "./runner/browser-env/vite/server";
2222

2323
interface RunOpts {
2424
browsers: string[];
@@ -70,14 +70,16 @@ export interface Testplane {
7070
export class Testplane extends BaseTestplane {
7171
protected failed: boolean;
7272
protected failedList: FailedListItem[];
73-
protected runner: NodejsEnvRunner | BrowserEnvRunner | null;
73+
protected runner: MainRunner | null;
74+
protected viteServer: ViteServer | null;
7475

7576
constructor(config?: string | ConfigInput) {
7677
super(config);
7778

7879
this.failed = false;
7980
this.failedList = [];
8081
this.runner = null;
82+
this.viteServer = null;
8183
}
8284

8385
extendCli(parser: Command): void {
@@ -91,6 +93,15 @@ export class Testplane extends BaseTestplane {
9193
configPath: this._config.configPath,
9294
});
9395

96+
if (!isRunInNodeJsEnv(this._config)) {
97+
try {
98+
this.viteServer = ViteServer.create(this._config);
99+
await this.viteServer.start();
100+
} catch (err) {
101+
throw new Error(`Vite server failed to start: ${(err as Error).message}`);
102+
}
103+
}
104+
94105
return super._init();
95106
}
96107

@@ -126,9 +137,7 @@ export class Testplane extends BaseTestplane {
126137
this._config.system.mochaOpts.timeout = 0;
127138
}
128139

129-
const RunnerClass = isRunInNodeJsEnv(this._config)
130-
? await import("./runner").then(m => m.MainRunner)
131-
: await import("./runner/browser-env").then(m => m.MainRunner);
140+
const RunnerClass = await import("./runner").then(m => m.MainRunner);
132141

133142
const runner = RunnerClass.create(this._config, this._interceptors);
134143
this.runner = runner;
@@ -257,6 +266,10 @@ export class Testplane extends BaseTestplane {
257266
}, timeout).unref();
258267
}
259268

269+
if (this.viteServer) {
270+
this.viteServer.close();
271+
}
272+
260273
if (this.runner) {
261274
this.runner.cancel();
262275
}

src/types/index.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { Events } from "../events";
2-
import type { MainRunner as NodejsEnvRunner } from "../runner";
3-
import type { MainRunner as BrowserEnvRunner } from "../runner/browser-env/index";
2+
import type { MainRunner } from "../runner";
43
import type { TestCollection } from "../test-collection";
54
import type { Test } from "../test-reader/test-object/test";
65
import type { Suite } from "../test-reader/test-object/suite";
@@ -219,7 +218,7 @@ export interface SnapshotsData {
219218

220219
export type MasterEventHandler<T extends BaseTestplane> = {
221220
(event: Events["INIT"], callback: () => Promise<void> | void): T;
222-
(event: Events["RUNNER_START"], callback: (runner: NodejsEnvRunner | BrowserEnvRunner) => Promise<void> | void): T;
221+
(event: Events["RUNNER_START"], callback: (runner: MainRunner) => Promise<void> | void): T;
223222
(event: Events["RUNNER_END"], callback: (result: StatsResult) => Promise<void> | void): T;
224223
(event: Events["SESSION_START"], callback: AsyncSessionEventCallback): T;
225224
(event: Events["SESSION_END"], callback: AsyncSessionEventCallback): T;

test/src/runner/browser-env/index.ts

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

test/src/runner/browser-env/vite/server.ts

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ import { ViteServer } from "../../../../../src/runner/browser-env/vite/server";
77
import { ManualMock } from "../../../../../src/runner/browser-env/vite/manual-mock";
88
import { makeConfigStub } from "../../../../utils";
99
import { BROWSER_TEST_RUN_ENV } from "../../../../../src/constants/config";
10+
import defaults from "../../../../../src/config/defaults";
11+
import { promiseDelay } from "../../../../../src/utils/promise";
12+
import RuntimeConfig from "../../../../../src/config/runtime-config";
1013

1114
import type { Config } from "../../../../../src/config";
1215
import type { BrowserTestRunEnvOptions } from "../../../../../src/runner/browser-env/vite/types";
13-
import { promiseDelay } from "../../../../../src/utils/promise";
1416

1517
describe("runner/browser-env/vite/server", () => {
1618
const sandbox = sinon.createSandbox();
@@ -54,6 +56,8 @@ describe("runner/browser-env/vite/server", () => {
5456
mockPlugin = sandbox.stub().returns([{ name: "default-plugin-2" }]);
5557
sandbox.stub(ManualMock, "create").resolves(sinon.stub() as unknown as ManualMock);
5658

59+
sandbox.stub(RuntimeConfig, "getInstance").returns({ extend: sandbox.stub() });
60+
5761
({ ViteServer: ViteServerStub } = proxyquire("../../../../../src/runner/browser-env/vite/server", {
5862
"get-port": getPortStub,
5963
"./socket": { createSocketServer },
@@ -222,6 +226,45 @@ describe("runner/browser-env/vite/server", () => {
222226
assert.callOrder(createSocketServer, viteServer.listen as SinonStub);
223227
});
224228

229+
it("should save vite base url to runtime config", async () => {
230+
const viteBaseUrl = "http://localhost:4444";
231+
const viteServer = mkViteServer_({
232+
resolvedUrls: {
233+
local: [viteBaseUrl],
234+
network: [],
235+
},
236+
});
237+
(Vite.createServer as SinonStub).resolves(viteServer);
238+
239+
await ViteServerStub.create(mkConfig_()).start();
240+
241+
assert.calledWith((RuntimeConfig.getInstance as SinonStub).lastCall.returnValue.extend, {
242+
viteBaseUrl,
243+
});
244+
});
245+
246+
it("should use base url from vite", async () => {
247+
const viteBaseUrl = "http://localhost:4444";
248+
const viteServer = mkViteServer_({
249+
resolvedUrls: {
250+
local: [viteBaseUrl],
251+
network: [],
252+
},
253+
});
254+
(Vite.createServer as SinonStub).resolves(viteServer);
255+
256+
const config = makeConfigStub({
257+
baseUrl: defaults.baseUrl,
258+
browsers: ["b1", "b2"],
259+
}) as Config;
260+
261+
await ViteServerStub.create(config).start();
262+
263+
assert.equal(config.baseUrl, viteBaseUrl);
264+
assert.equal(config.browsers.b1.baseUrl, viteBaseUrl);
265+
assert.equal(config.browsers.b2.baseUrl, viteBaseUrl);
266+
});
267+
225268
it("should inform on which address vite server started", async () => {
226269
const viteServer = mkViteServer_({
227270
resolvedUrls: {

0 commit comments

Comments
 (0)