genlayer 0.4.0 → 0.5.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,13 @@ import { initAction } from "../../src/commands/general/init";
5
5
  import { tmpdir } from "os";
6
6
  import {mkdtempSync} from "fs";
7
7
  import {join} from "path";
8
+ import fs from "fs";
9
+ import * as dotenv from "dotenv";
10
+
11
+
12
+ vi.mock("fs");
13
+ vi.mock("dotenv");
14
+
8
15
 
9
16
  const tempDir = mkdtempSync(join(tmpdir(), "test-initAction-"));
10
17
  const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir, headless: false, resetDb: false };
@@ -18,9 +25,7 @@ describe("init action", () => {
18
25
  let simServCheckVersionRequirements: ReturnType<any>;
19
26
  let simServResetDockerContainers: ReturnType<any>;
20
27
  let simServResetDockerImages: ReturnType<any>;
21
- let simServDownloadSimulator: ReturnType<any>;
22
28
  let simServgetAiProvidersOptions: ReturnType<any>;
23
- let simServConfigSimulator: ReturnType<any>;
24
29
  let simServRunSimulator: ReturnType<any>;
25
30
  let simServWaitForSimulator: ReturnType<any>;
26
31
  let simServPullOllamaModel: ReturnType<any>;
@@ -28,6 +33,7 @@ describe("init action", () => {
28
33
  let simServCreateRandomValidators: ReturnType<any>;
29
34
  let simServOpenFrontend: ReturnType<any>;
30
35
  let simGetSimulatorUrl: ReturnType<any>;
36
+ let simAddConfigToEnvFile: ReturnType<any>;
31
37
 
32
38
  beforeEach(() => {
33
39
  vi.clearAllMocks();
@@ -40,8 +46,6 @@ describe("init action", () => {
40
46
  simServCheckVersionRequirements = vi.spyOn(simulatorService, "checkVersionRequirements");
41
47
  simServResetDockerContainers = vi.spyOn(simulatorService, "resetDockerContainers");
42
48
  simServResetDockerImages = vi.spyOn(simulatorService, "resetDockerImages");
43
- simServDownloadSimulator = vi.spyOn(simulatorService, "downloadSimulator");
44
- simServConfigSimulator = vi.spyOn(simulatorService, "configSimulator");
45
49
  simServgetAiProvidersOptions = vi.spyOn(simulatorService, "getAiProvidersOptions");
46
50
  simServRunSimulator = vi.spyOn(simulatorService, "runSimulator");
47
51
  simServWaitForSimulator = vi.spyOn(simulatorService, "waitForSimulatorToBeReady");
@@ -50,6 +54,7 @@ describe("init action", () => {
50
54
  simServCreateRandomValidators = vi.spyOn(simulatorService, "createRandomValidators");
51
55
  simServOpenFrontend = vi.spyOn(simulatorService, "openFrontend");
52
56
  simGetSimulatorUrl = vi.spyOn(simulatorService, "getFrontendUrl")
57
+ simAddConfigToEnvFile = vi.spyOn(simulatorService, "addConfigToEnvFile")
53
58
 
54
59
  simServCheckVersionRequirements.mockResolvedValue({
55
60
  node: '',
@@ -59,22 +64,17 @@ describe("init action", () => {
59
64
  git: true,
60
65
  docker: true,
61
66
  })
67
+ simAddConfigToEnvFile.mockResolvedValue(true);
68
+ const mockEnvContent = "FRONTEND_PORT=8080";
69
+ const mockEnvConfig = { FRONTEND_PORT: "8080" };
70
+ vi.mocked(fs.readFileSync).mockReturnValue(mockEnvContent);
71
+ vi.mocked(dotenv.parse).mockReturnValue(mockEnvConfig);
62
72
  });
63
73
 
64
74
  afterEach(() => {
65
75
  vi.restoreAllMocks();
66
76
  });
67
77
 
68
- test("if both requirements are missing, then the execution fails", async () => {
69
- simServCheckInstallRequirements.mockResolvedValue({ git: false, docker: false });
70
-
71
- await initAction(defaultActionOptions, simulatorService);
72
-
73
- expect(error).toHaveBeenCalledWith(
74
- "Git and Docker are not installed. Please install them and try again.\n"
75
- );
76
- });
77
-
78
78
  test("if only docker is missing, then the execution fails", async () => {
79
79
  simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: false });
80
80
 
@@ -83,14 +83,6 @@ describe("init action", () => {
83
83
  expect(error).toHaveBeenCalledWith("Docker is not installed. Please install Docker and try again.\n");
84
84
  });
85
85
 
86
- test("if only git is missing, then the execution fails", async () => {
87
- simServCheckInstallRequirements.mockResolvedValue({ git: false, docker: true });
88
-
89
- await initAction(defaultActionOptions, simulatorService);
90
-
91
- expect(error).toHaveBeenCalledWith("Git is not installed. Please install Git and try again.\n");
92
- });
93
-
94
86
  test("if check install requirements fail, then the execution aborts", async () => {
95
87
  simServCheckInstallRequirements.mockRejectedValue(new Error("Error"));
96
88
 
@@ -169,7 +161,6 @@ describe("init action", () => {
169
161
  { name: "OpenAI", value: "openai" },
170
162
  { name: "Heurist", value: "heuristai" },
171
163
  ]);
172
- simServConfigSimulator.mockResolvedValue(true);
173
164
  simServRunSimulator.mockResolvedValue(true);
174
165
  simServWaitForSimulator.mockResolvedValue({ initialized: true });
175
166
  simServPullOllamaModel.mockResolvedValue(true);
@@ -200,7 +191,6 @@ describe("init action", () => {
200
191
  { name: "OpenAI", value: "openai" },
201
192
  { name: "Heurist", value: "heuristai" },
202
193
  ]);
203
- simServConfigSimulator.mockResolvedValue(true);
204
194
  simServRunSimulator.mockResolvedValue(true);
205
195
  simServWaitForSimulator.mockResolvedValue({ initialized: true });
206
196
  simServPullOllamaModel.mockResolvedValue(true);
@@ -230,7 +220,6 @@ describe("init action", () => {
230
220
  { name: "OpenAI", value: "openai" },
231
221
  { name: "Heurist", value: "heuristai" },
232
222
  ]);
233
- simServConfigSimulator.mockResolvedValue(true);
234
223
  simServRunSimulator.mockResolvedValue(true);
235
224
  simServWaitForSimulator.mockResolvedValue({ initialized: true });
236
225
  simServPullOllamaModel.mockResolvedValue(true);
@@ -248,18 +237,6 @@ describe("init action", () => {
248
237
  expect(error).toHaveBeenCalledWith('Unable to initialize the validators.');
249
238
  });
250
239
 
251
-
252
- test("if configSimulator fails, then the execution aborts", async () => {
253
- inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, selectedLlmProviders: [] });
254
- simServConfigSimulator.mockRejectedValue(new Error("Error"));
255
- simServResetDockerContainers.mockResolvedValue(true);
256
- simServResetDockerImages.mockResolvedValue(true);
257
-
258
- await initAction(defaultActionOptions, simulatorService);
259
-
260
- expect(error).toHaveBeenCalledWith(new Error("Error"));
261
- });
262
-
263
240
  test("if runSimulator fails, then the execution aborts", async () => {
264
241
  inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, selectedLlmProviders: [] });
265
242
  simServRunSimulator.mockRejectedValue(new Error("Error"));
@@ -285,7 +262,7 @@ describe("init action", () => {
285
262
  { name: "Heurist", value: "heuristai" },
286
263
  { name: "Ollama", value: "ollama" },
287
264
  ]);
288
- simServConfigSimulator.mockResolvedValue(true);
265
+
289
266
  simServRunSimulator.mockResolvedValue(true);
290
267
  simServWaitForSimulator.mockResolvedValue({ initialized: true });
291
268
  simServPullOllamaModel.mockResolvedValue(true);
@@ -308,20 +285,6 @@ describe("init action", () => {
308
285
  expect(error).toHaveBeenCalledWith(errorMsg);
309
286
  });
310
287
 
311
- test("logs 'Aborted!' if confirmDownload is false", async () => {
312
- inquirerPrompt
313
- .mockResolvedValueOnce({ confirmReset: true })
314
- .mockResolvedValueOnce({ confirmDownload: false });
315
-
316
- simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true });
317
- simServResetDockerContainers.mockResolvedValue(true);
318
- simServResetDockerImages.mockResolvedValue(true);
319
-
320
- await initAction(defaultActionOptions, simulatorService);
321
-
322
- expect(log).toHaveBeenCalledWith("Aborted!");
323
- });
324
-
325
288
  test("logs error if resetDockerContainers throws", async () => {
326
289
  inquirerPrompt.mockResolvedValue({ confirmReset: true });
327
290
  simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true });
@@ -334,9 +297,11 @@ describe("init action", () => {
334
297
  });
335
298
 
336
299
  test("prompts for LLM providers and validates that at least one is selected", async () => {
300
+ const mockEnvContent = "FRONTEND_PORT=8080";
301
+ vi.mocked(fs.readFileSync).mockReturnValue(mockEnvContent);
302
+
337
303
  inquirerPrompt
338
304
  .mockResolvedValueOnce({ confirmReset: true })
339
- .mockResolvedValueOnce({ confirmDownload: true })
340
305
  .mockImplementation((questions: any) => {
341
306
  if (questions[0].type === "checkbox") {
342
307
  const validateFunction = questions[0].validate;
@@ -353,11 +318,9 @@ describe("init action", () => {
353
318
  }
354
319
  });
355
320
 
356
- simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true });
321
+ simServCheckInstallRequirements.mockResolvedValue({ docker: true });
357
322
  simServResetDockerContainers.mockResolvedValue(true);
358
323
  simServResetDockerImages.mockResolvedValue(true);
359
- simServDownloadSimulator.mockResolvedValue({ wasInstalled: false });
360
- simServConfigSimulator.mockResolvedValue(true);
361
324
  simServRunSimulator.mockResolvedValue(true);
362
325
  simServWaitForSimulator.mockResolvedValue({ initialized: true });
363
326
  simServDeleteAllValidators.mockResolvedValue(true);
@@ -367,31 +330,16 @@ describe("init action", () => {
367
330
  await initAction(defaultActionOptions, simulatorService);
368
331
  });
369
332
 
370
- test("logs error if downloadSimulator throws", async () => {
371
- inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true });
372
- simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true });
373
- simServResetDockerContainers.mockResolvedValue(true);
374
- simServResetDockerImages.mockResolvedValue(true);
375
- const errorMsg = new Error("downloadSimulator error");
376
- simServDownloadSimulator.mockRejectedValueOnce(errorMsg);
377
-
378
- await initAction(defaultActionOptions, simulatorService);
379
-
380
- expect(error).toHaveBeenCalledWith(errorMsg);
381
- });
382
333
 
383
334
  test("logs error message if simulator fails to initialize with ERROR code", async () => {
384
335
  inquirerPrompt
385
336
  .mockResolvedValueOnce({ confirmReset: true })
386
- .mockResolvedValueOnce({ confirmDownload: true })
387
337
  .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] })
388
338
  .mockResolvedValueOnce({ openai: "API_KEY1" });
389
339
 
390
- simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true });
340
+ simServCheckInstallRequirements.mockResolvedValue({ docker: true });
391
341
  simServResetDockerContainers.mockResolvedValue(true);
392
342
  simServResetDockerImages.mockResolvedValue(true);
393
- simServDownloadSimulator.mockResolvedValue({ wasInstalled: false });
394
- simServConfigSimulator.mockResolvedValue(true);
395
343
  simServRunSimulator.mockResolvedValue(true);
396
344
 
397
345
  simServWaitForSimulator.mockResolvedValue({
@@ -416,8 +364,6 @@ describe("init action", () => {
416
364
  simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true });
417
365
  simServResetDockerContainers.mockResolvedValue(true);
418
366
  simServResetDockerImages.mockResolvedValue(true);
419
- simServDownloadSimulator.mockResolvedValue({ wasInstalled: false });
420
- simServConfigSimulator.mockResolvedValue(true);
421
367
  const errorMsg = new Error("runSimulator error");
422
368
  simServRunSimulator.mockRejectedValueOnce(errorMsg);
423
369
 
@@ -436,8 +382,6 @@ describe("init action", () => {
436
382
  simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true });
437
383
  simServResetDockerContainers.mockResolvedValue(true);
438
384
  simServResetDockerImages.mockResolvedValue(true);
439
- simServDownloadSimulator.mockResolvedValue({ wasInstalled: false });
440
- simServConfigSimulator.mockResolvedValue(true);
441
385
  simServRunSimulator.mockResolvedValue(true);
442
386
  simServWaitForSimulator.mockResolvedValue({
443
387
  initialized: false,
@@ -455,15 +399,12 @@ describe("init action", () => {
455
399
  test("catches and logs error if waitForSimulatorToBeReady throws an exception", async () => {
456
400
  inquirerPrompt
457
401
  .mockResolvedValueOnce({ confirmReset: true })
458
- .mockResolvedValueOnce({ confirmDownload: true })
459
402
  .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] })
460
403
  .mockResolvedValueOnce({ openai: "API_KEY1" });
461
404
 
462
- simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true });
405
+ simServCheckInstallRequirements.mockResolvedValue({ docker: true });
463
406
  simServResetDockerContainers.mockResolvedValue(true);
464
407
  simServResetDockerImages.mockResolvedValue(true);
465
- simServDownloadSimulator.mockResolvedValue({ wasInstalled: false });
466
- simServConfigSimulator.mockResolvedValue(true);
467
408
  simServRunSimulator.mockResolvedValue(true);
468
409
 
469
410
  const errorMsg = new Error("Unexpected simulator error");
@@ -475,17 +416,17 @@ describe("init action", () => {
475
416
  });
476
417
 
477
418
  test("catches and logs error if openFrontend throws an exception", async () => {
419
+ const mockEnvContent = "FRONTEND_PORT=8080";
420
+ vi.mocked(fs.readFileSync).mockReturnValue(mockEnvContent);
421
+
478
422
  inquirerPrompt
479
423
  .mockResolvedValueOnce({ confirmReset: true })
480
- .mockResolvedValueOnce({ confirmDownload: true })
481
424
  .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] })
482
425
  .mockResolvedValueOnce({ openai: "API_KEY1" });
483
426
 
484
- simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true });
427
+ simServCheckInstallRequirements.mockResolvedValue({ docker: true });
485
428
  simServResetDockerContainers.mockResolvedValue(true);
486
429
  simServResetDockerImages.mockResolvedValue(true);
487
- simServDownloadSimulator.mockResolvedValue({ wasInstalled: false });
488
- simServConfigSimulator.mockResolvedValue(true);
489
430
  simServRunSimulator.mockResolvedValue(true);
490
431
  simServWaitForSimulator.mockResolvedValue({ initialized: true });
491
432
  simServDeleteAllValidators.mockResolvedValue(true);
@@ -12,8 +12,6 @@ describe("startAction - Additional Tests", () => {
12
12
  const defaultOptions: StartActionOptions = {
13
13
  resetValidators: false,
14
14
  numValidators: 5,
15
- branch: "main",
16
- location: '',
17
15
  headless: false,
18
16
  resetDb: false
19
17
  };
@@ -32,6 +30,7 @@ describe("startAction - Additional Tests", () => {
32
30
  openFrontend: vi.fn().mockResolvedValue(undefined),
33
31
  setSimulatorLocation: vi.fn().mockResolvedValue(undefined),
34
32
  setComposeOptions: vi.fn(),
33
+ checkCliVersion: vi.fn(),
35
34
  getAiProvidersOptions: vi.fn(() => [
36
35
  { name: "Provider A", value: "providerA" },
37
36
  { name: "Provider B", value: "providerB" },
@@ -48,13 +47,10 @@ describe("startAction - Additional Tests", () => {
48
47
  test("runs successfully with default options and keeps existing validators", async () => {
49
48
  await startAction(defaultOptions, simulatorService);
50
49
 
51
- expect(simulatorService.updateSimulator).toHaveBeenCalledWith("main");
52
50
  expect(simulatorService.runSimulator).toHaveBeenCalled();
53
51
  expect(simulatorService.waitForSimulatorToBeReady).toHaveBeenCalled();
54
52
 
55
53
  expect(logSpy).toHaveBeenCalledWith("Starting GenLayer simulator keeping the existing validators");
56
- expect(logSpy).toHaveBeenCalledWith("Updating GenLayer Simulator...");
57
- expect(logSpy).toHaveBeenCalledWith("Running the GenLayer Simulator...");
58
54
  expect(logSpy).toHaveBeenCalledWith("Simulator is running!");
59
55
  expect(logSpy).toHaveBeenCalledWith("GenLayer simulator initialized successfully! Go to http://localhost:8080 in your browser to access it.");
60
56
 
@@ -64,26 +60,15 @@ describe("startAction - Additional Tests", () => {
64
60
  test("runs successfully with custom options and keeps existing validators", async () => {
65
61
  await startAction({...defaultOptions, headless: true, resetDb: true}, simulatorService);
66
62
 
67
- expect(simulatorService.updateSimulator).toHaveBeenCalledWith("main");
68
63
  expect(simulatorService.runSimulator).toHaveBeenCalled();
69
64
  expect(simulatorService.waitForSimulatorToBeReady).toHaveBeenCalled();
70
65
 
71
66
  expect(logSpy).toHaveBeenCalledWith("Starting GenLayer simulator keeping the existing validators");
72
- expect(logSpy).toHaveBeenCalledWith("Updating GenLayer Simulator...");
73
- expect(logSpy).toHaveBeenCalledWith("Running the GenLayer Simulator...");
67
+
74
68
  expect(logSpy).toHaveBeenCalledWith("Simulator is running!");
75
69
  expect(logSpy).toHaveBeenCalledWith("GenLayer simulator initialized successfully! ");
76
70
  });
77
71
 
78
- test("logs error and stops if updateSimulator fails", async () => {
79
- const errorMsg = new Error("updateSimulator error");
80
- (simulatorService.updateSimulator as Mock).mockRejectedValueOnce(errorMsg);
81
-
82
- await startAction(defaultOptions, simulatorService);
83
-
84
- expect(errorSpy).toHaveBeenCalledWith(errorMsg);
85
- expect(simulatorService.runSimulator).not.toHaveBeenCalled();
86
- });
87
72
 
88
73
  test("logs error and stops if runSimulator fails", async () => {
89
74
  const errorMsg = new Error("runSimulator error");
@@ -7,8 +7,6 @@ import simulatorService from '../../src/lib/services/simulator'
7
7
  const openFrontendSpy = vi.spyOn(simulatorService, "openFrontend");
8
8
  const defaultOptions = {
9
9
  numValidators: "5",
10
- branch: "main",
11
- location: process.cwd(),
12
10
  headless: false,
13
11
  resetDb: false
14
12
  }
@@ -52,21 +50,6 @@ describe("init command", () => {
52
50
  expect(numValidatorsOption?.defaultValue).toBe("5");
53
51
  });
54
52
 
55
- test("option --branch is accepted", async () => {
56
- expect(() => program.parse(["node", "test", "init", "--branch", "example"])).not.toThrow();
57
- });
58
-
59
- test("option --branch default value is main", async () => {
60
- const branchOption = getCommandOption(initCommand, "--branch");
61
- expect(branchOption?.defaultValue).toBe("main");
62
- });
63
-
64
- test("option --location default value is user's current directory", async () => {
65
- // Given // When
66
- const locationOption = getCommandOption(initCommand, "--location");
67
- expect(locationOption?.defaultValue).toBe(process.cwd());
68
- });
69
-
70
53
 
71
54
  test("random option is not accepted", async () => {
72
55
  initCommand?.exitOverride();
@@ -10,8 +10,6 @@ const action = vi.fn();
10
10
  const defaultOptions = {
11
11
  resetValidators: false,
12
12
  numValidators: "5",
13
- branch: "main",
14
- location: process.cwd(),
15
13
  headless: false ,
16
14
  resetDb: false
17
15
  }
@@ -58,14 +56,6 @@ describe("up command", () => {
58
56
  expect(numValidatorsOption?.defaultValue).toBe("5");
59
57
  });
60
58
 
61
- test("option --branch is accepted", async () => {
62
- expect(() => program.parse(["node", "test", "up", "--branch", "development"])).not.toThrow();
63
- });
64
-
65
- test("option --branch default value is main", async () => {
66
- const branchOption = getCommandOption(upCommand, "--branch");
67
- expect(branchOption?.defaultValue).toBe("main");
68
- });
69
59
 
70
60
  test("unrecognized option is not accepted", async () => {
71
61
  upCommand?.exitOverride();
@@ -91,15 +81,13 @@ describe("up command", () => {
91
81
  "--reset-validators",
92
82
  "--numValidators",
93
83
  "10",
94
- "--branch",
95
- "development",
96
84
  "--headless",
97
85
  "true",
98
86
  "--reset-db",
99
87
  "true"
100
88
  ]);
101
89
  expect(action).toHaveBeenCalledTimes(1);
102
- expect(action).toHaveBeenCalledWith({...defaultOptions, headless: true, branch: 'development', numValidators: '10', resetValidators: true, resetDb: true});
90
+ expect(action).toHaveBeenCalledWith({...defaultOptions, headless: true, numValidators: '10', resetValidators: true, resetDb: true});
103
91
  expect(openFrontendSpy).not.toHaveBeenCalled();
104
92
  });
105
93
  });