movehat 0.1.8 → 0.2.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.
- package/README.md +2 -2
- package/dist/__tests__/deployContract.test.d.ts +2 -0
- package/dist/__tests__/deployContract.test.d.ts.map +1 -0
- package/dist/__tests__/deployContract.test.js +368 -0
- package/dist/__tests__/deployContract.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +46 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts +24 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts.map +1 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.js +82 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.js.map +1 -0
- package/dist/__tests__/fork/api.test.d.ts +2 -0
- package/dist/__tests__/fork/api.test.d.ts.map +1 -0
- package/dist/__tests__/fork/api.test.js +110 -0
- package/dist/__tests__/fork/api.test.js.map +1 -0
- package/dist/__tests__/harness/Harness.createLive.test.d.ts +2 -0
- package/dist/__tests__/harness/Harness.createLive.test.d.ts.map +1 -0
- package/dist/__tests__/harness/Harness.createLive.test.js +53 -0
- package/dist/__tests__/harness/Harness.createLive.test.js.map +1 -0
- package/dist/__tests__/harness/Harness.proxy.test.d.ts +2 -0
- package/dist/__tests__/harness/Harness.proxy.test.d.ts.map +1 -0
- package/dist/__tests__/harness/Harness.proxy.test.js +93 -0
- package/dist/__tests__/harness/Harness.proxy.test.js.map +1 -0
- package/dist/__tests__/harness/_fixture.d.ts +54 -0
- package/dist/__tests__/harness/_fixture.d.ts.map +1 -0
- package/dist/__tests__/harness/_fixture.js +69 -0
- package/dist/__tests__/harness/_fixture.js.map +1 -0
- package/dist/__tests__/harness/codeObject.deploy.test.d.ts +2 -0
- package/dist/__tests__/harness/codeObject.deploy.test.d.ts.map +1 -0
- package/dist/__tests__/harness/codeObject.deploy.test.js +288 -0
- package/dist/__tests__/harness/codeObject.deploy.test.js.map +1 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.d.ts +2 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.js +138 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.js.map +1 -0
- package/dist/__tests__/harness/script.test.d.ts +2 -0
- package/dist/__tests__/harness/script.test.d.ts.map +1 -0
- package/dist/__tests__/harness/script.test.js +219 -0
- package/dist/__tests__/harness/script.test.js.map +1 -0
- package/dist/__tests__/harness/view.test.d.ts +2 -0
- package/dist/__tests__/harness/view.test.d.ts.map +1 -0
- package/dist/__tests__/harness/view.test.js +92 -0
- package/dist/__tests__/harness/view.test.js.map +1 -0
- package/dist/__tests__/runtime.test.d.ts +2 -0
- package/dist/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/__tests__/runtime.test.js +141 -0
- package/dist/__tests__/runtime.test.js.map +1 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/compile.test.d.ts +2 -0
- package/dist/commands/__tests__/compile.test.d.ts.map +1 -0
- package/dist/commands/__tests__/compile.test.js +351 -0
- package/dist/commands/__tests__/compile.test.js.map +1 -0
- package/dist/commands/__tests__/init.test.d.ts +2 -0
- package/dist/commands/__tests__/init.test.d.ts.map +1 -0
- package/dist/commands/__tests__/init.test.js +101 -0
- package/dist/commands/__tests__/init.test.js.map +1 -0
- package/dist/commands/__tests__/run.test.d.ts +2 -0
- package/dist/commands/__tests__/run.test.d.ts.map +1 -0
- package/dist/commands/__tests__/run.test.js +166 -0
- package/dist/commands/__tests__/run.test.js.map +1 -0
- package/dist/commands/__tests__/test-move.test.d.ts +2 -0
- package/dist/commands/__tests__/test-move.test.d.ts.map +1 -0
- package/dist/commands/__tests__/test-move.test.js +59 -0
- package/dist/commands/__tests__/test-move.test.js.map +1 -0
- package/dist/commands/__tests__/test.test.d.ts +2 -0
- package/dist/commands/__tests__/test.test.d.ts.map +1 -0
- package/dist/commands/__tests__/test.test.js +168 -0
- package/dist/commands/__tests__/test.test.js.map +1 -0
- package/dist/commands/__tests__/update.test.d.ts +2 -0
- package/dist/commands/__tests__/update.test.d.ts.map +1 -0
- package/dist/commands/__tests__/update.test.js +176 -0
- package/dist/commands/__tests__/update.test.js.map +1 -0
- package/dist/commands/compile.d.ts +7 -1
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +150 -33
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/fork/__tests__/create.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/create.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/create.test.js +108 -0
- package/dist/commands/fork/__tests__/create.test.js.map +1 -0
- package/dist/commands/fork/__tests__/fund.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/fund.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/fund.test.js +72 -0
- package/dist/commands/fork/__tests__/fund.test.js.map +1 -0
- package/dist/commands/fork/__tests__/list.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/list.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/list.test.js +119 -0
- package/dist/commands/fork/__tests__/list.test.js.map +1 -0
- package/dist/commands/fork/__tests__/serve.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/serve.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/serve.test.js +97 -0
- package/dist/commands/fork/__tests__/serve.test.js.map +1 -0
- package/dist/commands/fork/__tests__/view-resource.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/view-resource.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/view-resource.test.js +77 -0
- package/dist/commands/fork/__tests__/view-resource.test.js.map +1 -0
- package/dist/commands/fork/create.d.ts +1 -1
- package/dist/commands/fork/create.d.ts.map +1 -1
- package/dist/commands/fork/create.js +3 -2
- package/dist/commands/fork/create.js.map +1 -1
- package/dist/commands/fork/fund.d.ts.map +1 -1
- package/dist/commands/fork/fund.js +15 -8
- package/dist/commands/fork/fund.js.map +1 -1
- package/dist/commands/fork/list.d.ts.map +1 -1
- package/dist/commands/fork/list.js +2 -1
- package/dist/commands/fork/list.js.map +1 -1
- package/dist/commands/fork/serve.d.ts +1 -0
- package/dist/commands/fork/serve.d.ts.map +1 -1
- package/dist/commands/fork/serve.js +4 -2
- package/dist/commands/fork/serve.js.map +1 -1
- package/dist/commands/fork/view-resource.d.ts.map +1 -1
- package/dist/commands/fork/view-resource.js +10 -5
- package/dist/commands/fork/view-resource.js.map +1 -1
- package/dist/commands/run.d.ts +15 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +50 -27
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/test-move.d.ts.map +1 -1
- package/dist/commands/test-move.js +3 -2
- package/dist/commands/test-move.js.map +1 -1
- package/dist/commands/test.js +52 -46
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +15 -13
- package/dist/commands/update.js.map +1 -1
- package/dist/core/AccountManager.d.ts +1 -1
- package/dist/core/AccountManager.d.ts.map +1 -1
- package/dist/core/AccountManager.js +20 -7
- package/dist/core/AccountManager.js.map +1 -1
- package/dist/core/Publisher.d.ts +31 -0
- package/dist/core/Publisher.d.ts.map +1 -0
- package/dist/core/Publisher.js +248 -0
- package/dist/core/Publisher.js.map +1 -0
- package/dist/core/__tests__/AccountManager.test.d.ts +2 -0
- package/dist/core/__tests__/AccountManager.test.d.ts.map +1 -0
- package/dist/core/__tests__/AccountManager.test.js +239 -0
- package/dist/core/__tests__/AccountManager.test.js.map +1 -0
- package/dist/core/__tests__/config.test.d.ts +2 -0
- package/dist/core/__tests__/config.test.d.ts.map +1 -0
- package/dist/core/__tests__/config.test.js +311 -0
- package/dist/core/__tests__/config.test.js.map +1 -0
- package/dist/core/__tests__/deployments.test.d.ts +2 -0
- package/dist/core/__tests__/deployments.test.d.ts.map +1 -0
- package/dist/core/__tests__/deployments.test.js +201 -0
- package/dist/core/__tests__/deployments.test.js.map +1 -0
- package/dist/core/__tests__/shell.test.d.ts +2 -0
- package/dist/core/__tests__/shell.test.d.ts.map +1 -0
- package/dist/core/__tests__/shell.test.js +107 -0
- package/dist/core/__tests__/shell.test.js.map +1 -0
- package/dist/core/config.d.ts +13 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +80 -11
- package/dist/core/config.js.map +1 -1
- package/dist/core/contract.d.ts +1 -1
- package/dist/core/contract.d.ts.map +1 -1
- package/dist/core/contract.js +15 -4
- package/dist/core/contract.js.map +1 -1
- package/dist/core/deployments.d.ts +2 -2
- package/dist/core/deployments.d.ts.map +1 -1
- package/dist/core/deployments.js +8 -6
- package/dist/core/deployments.js.map +1 -1
- package/dist/core/movementProfile.d.ts +34 -0
- package/dist/core/movementProfile.d.ts.map +1 -0
- package/dist/core/movementProfile.js +150 -0
- package/dist/core/movementProfile.js.map +1 -0
- package/dist/core/shell.d.ts +23 -7
- package/dist/core/shell.d.ts.map +1 -1
- package/dist/core/shell.js +32 -14
- package/dist/core/shell.js.map +1 -1
- package/dist/errors.d.ts +35 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +54 -0
- package/dist/errors.js.map +1 -1
- package/dist/fork/__tests__/manager.test.d.ts +2 -0
- package/dist/fork/__tests__/manager.test.d.ts.map +1 -0
- package/dist/fork/__tests__/manager.test.js +309 -0
- package/dist/fork/__tests__/manager.test.js.map +1 -0
- package/dist/fork/__tests__/server.test.d.ts +2 -0
- package/dist/fork/__tests__/server.test.d.ts.map +1 -0
- package/dist/fork/__tests__/server.test.js +54 -0
- package/dist/fork/__tests__/server.test.js.map +1 -0
- package/dist/fork/__tests__/storage.test.d.ts +2 -0
- package/dist/fork/__tests__/storage.test.d.ts.map +1 -0
- package/dist/fork/__tests__/storage.test.js +222 -0
- package/dist/fork/__tests__/storage.test.js.map +1 -0
- package/dist/fork/__tests__/test.test.d.ts +2 -0
- package/dist/fork/__tests__/test.test.d.ts.map +1 -0
- package/dist/fork/__tests__/test.test.js +81 -0
- package/dist/fork/__tests__/test.test.js.map +1 -0
- package/dist/fork/api.d.ts +14 -3
- package/dist/fork/api.d.ts.map +1 -1
- package/dist/fork/api.js +25 -14
- package/dist/fork/api.js.map +1 -1
- package/dist/fork/manager.d.ts +23 -9
- package/dist/fork/manager.d.ts.map +1 -1
- package/dist/fork/manager.js +79 -36
- package/dist/fork/manager.js.map +1 -1
- package/dist/fork/server.d.ts +11 -3
- package/dist/fork/server.d.ts.map +1 -1
- package/dist/fork/server.js +45 -13
- package/dist/fork/server.js.map +1 -1
- package/dist/fork/storage.d.ts +4 -4
- package/dist/fork/storage.d.ts.map +1 -1
- package/dist/fork/storage.js +7 -9
- package/dist/fork/storage.js.map +1 -1
- package/dist/fork/test.d.ts +13 -4
- package/dist/fork/test.d.ts.map +1 -1
- package/dist/fork/test.js +36 -27
- package/dist/fork/test.js.map +1 -1
- package/dist/harness/Harness.d.ts +124 -0
- package/dist/harness/Harness.d.ts.map +1 -0
- package/dist/harness/Harness.js +193 -0
- package/dist/harness/Harness.js.map +1 -0
- package/dist/harness/codeObject.d.ts +31 -0
- package/dist/harness/codeObject.d.ts.map +1 -0
- package/dist/harness/codeObject.js +271 -0
- package/dist/harness/codeObject.js.map +1 -0
- package/dist/harness/errors.d.ts +14 -0
- package/dist/harness/errors.d.ts.map +1 -0
- package/dist/harness/errors.js +22 -0
- package/dist/harness/errors.js.map +1 -0
- package/dist/harness/index.d.ts +4 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +3 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/proxy.d.ts +7 -0
- package/dist/harness/proxy.d.ts.map +1 -0
- package/dist/harness/proxy.js +36 -0
- package/dist/harness/proxy.js.map +1 -0
- package/dist/harness/script.d.ts +21 -0
- package/dist/harness/script.d.ts.map +1 -0
- package/dist/harness/script.js +155 -0
- package/dist/harness/script.js.map +1 -0
- package/dist/harness/view.d.ts +22 -0
- package/dist/harness/view.d.ts.map +1 -0
- package/dist/harness/view.js +28 -0
- package/dist/harness/view.js.map +1 -0
- package/dist/helpers/__tests__/semver-utils.test.d.ts +2 -0
- package/dist/helpers/__tests__/semver-utils.test.d.ts.map +1 -0
- package/dist/helpers/__tests__/semver-utils.test.js +103 -0
- package/dist/helpers/__tests__/semver-utils.test.js.map +1 -0
- package/dist/helpers/index.d.ts +3 -2
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/index.js +2 -2
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/move-tests.d.ts +3 -3
- package/dist/helpers/move-tests.d.ts.map +1 -1
- package/dist/helpers/move-tests.js +21 -20
- package/dist/helpers/move-tests.js.map +1 -1
- package/dist/helpers/npm-registry.d.ts.map +1 -1
- package/dist/helpers/npm-registry.js +1 -3
- package/dist/helpers/npm-registry.js.map +1 -1
- package/dist/helpers/semver-utils.d.ts.map +1 -1
- package/dist/helpers/semver-utils.js +4 -3
- package/dist/helpers/semver-utils.js.map +1 -1
- package/dist/helpers/setup.d.ts.map +1 -1
- package/dist/helpers/setup.js +10 -6
- package/dist/helpers/setup.js.map +1 -1
- package/dist/helpers/setupLocalTesting.d.ts +32 -27
- package/dist/helpers/setupLocalTesting.d.ts.map +1 -1
- package/dist/helpers/setupLocalTesting.js +179 -180
- package/dist/helpers/setupLocalTesting.js.map +1 -1
- package/dist/helpers/testFixtures.d.ts +19 -53
- package/dist/helpers/testFixtures.d.ts.map +1 -1
- package/dist/helpers/testFixtures.js +89 -107
- package/dist/helpers/testFixtures.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/node/LocalNodeManager.d.ts +9 -1
- package/dist/node/LocalNodeManager.d.ts.map +1 -1
- package/dist/node/LocalNodeManager.js +75 -58
- package/dist/node/LocalNodeManager.js.map +1 -1
- package/dist/node/__tests__/LocalNodeManager.test.d.ts +2 -0
- package/dist/node/__tests__/LocalNodeManager.test.d.ts.map +1 -0
- package/dist/node/__tests__/LocalNodeManager.test.js +349 -0
- package/dist/node/__tests__/LocalNodeManager.test.js.map +1 -0
- package/dist/runtime.d.ts +12 -15
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +32 -241
- package/dist/runtime.js.map +1 -1
- package/dist/templates/README.md +1 -1
- package/dist/templates/movehat.config.ts +10 -0
- package/dist/templates/package.json +2 -1
- package/dist/templates/scripts/deploy-counter.ts +46 -38
- package/dist/templates/tests/Counter.test.ts +51 -51
- package/dist/templates/types/movehat.d.ts +6 -9
- package/dist/types/config.d.ts +8 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/fork.d.ts +7 -1
- package/dist/types/fork.d.ts.map +1 -1
- package/dist/types/harness.d.ts +166 -0
- package/dist/types/harness.d.ts.map +1 -0
- package/dist/types/harness.js +2 -0
- package/dist/types/harness.js.map +1 -0
- package/dist/types/runtime.d.ts +7 -1
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/ui/__tests__/colors.test.d.ts +2 -0
- package/dist/ui/__tests__/colors.test.d.ts.map +1 -0
- package/dist/ui/__tests__/colors.test.js +127 -0
- package/dist/ui/__tests__/colors.test.js.map +1 -0
- package/dist/ui/colors.d.ts.map +1 -1
- package/dist/ui/colors.js +6 -2
- package/dist/ui/colors.js.map +1 -1
- package/dist/ui/logger.d.ts +17 -0
- package/dist/ui/logger.d.ts.map +1 -1
- package/dist/ui/logger.js +22 -0
- package/dist/ui/logger.js.map +1 -1
- package/dist/ui/symbols.d.ts +1 -0
- package/dist/ui/symbols.d.ts.map +1 -1
- package/dist/ui/symbols.js +7 -1
- package/dist/ui/symbols.js.map +1 -1
- package/dist/utils/__tests__/address.test.d.ts +2 -0
- package/dist/utils/__tests__/address.test.d.ts.map +1 -0
- package/dist/utils/__tests__/address.test.js +70 -0
- package/dist/utils/__tests__/address.test.js.map +1 -0
- package/dist/utils/__tests__/childProcessAdapter.test.d.ts +2 -0
- package/dist/utils/__tests__/childProcessAdapter.test.d.ts.map +1 -0
- package/dist/utils/__tests__/childProcessAdapter.test.js +217 -0
- package/dist/utils/__tests__/childProcessAdapter.test.js.map +1 -0
- package/dist/utils/__tests__/runCli.test.d.ts +2 -0
- package/dist/utils/__tests__/runCli.test.d.ts.map +1 -0
- package/dist/utils/__tests__/runCli.test.js +187 -0
- package/dist/utils/__tests__/runCli.test.js.map +1 -0
- package/dist/utils/address.d.ts +33 -0
- package/dist/utils/address.d.ts.map +1 -0
- package/dist/utils/address.js +52 -0
- package/dist/utils/address.js.map +1 -0
- package/dist/utils/childProcessAdapter.d.ts +93 -0
- package/dist/utils/childProcessAdapter.d.ts.map +1 -0
- package/dist/utils/childProcessAdapter.js +109 -0
- package/dist/utils/childProcessAdapter.js.map +1 -0
- package/dist/utils/parseCliOutput.d.ts +20 -0
- package/dist/utils/parseCliOutput.d.ts.map +1 -0
- package/dist/utils/parseCliOutput.js +26 -0
- package/dist/utils/parseCliOutput.js.map +1 -0
- package/dist/utils/redact.d.ts +15 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +24 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/runCli.d.ts +24 -0
- package/dist/utils/runCli.d.ts.map +1 -0
- package/dist/utils/runCli.js +37 -0
- package/dist/utils/runCli.js.map +1 -0
- package/package.json +14 -4
- package/src/__tests__/deployContract.test.ts +429 -0
- package/src/__tests__/errors.test.ts +84 -0
- package/src/__tests__/fixtures/sigint-deploy-harness.ts +95 -0
- package/src/__tests__/fork/api.test.ts +143 -0
- package/src/__tests__/harness/Harness.createLive.test.ts +57 -0
- package/src/__tests__/harness/Harness.proxy.test.ts +115 -0
- package/src/__tests__/harness/_fixture.ts +131 -0
- package/src/__tests__/harness/codeObject.deploy.test.ts +319 -0
- package/src/__tests__/harness/codeObject.upgrade.test.ts +156 -0
- package/src/__tests__/harness/script.test.ts +245 -0
- package/src/__tests__/harness/view.test.ts +104 -0
- package/src/__tests__/runtime.test.ts +182 -0
- package/src/cli.ts +2 -1
- package/src/commands/__tests__/compile.test.ts +407 -0
- package/src/commands/__tests__/init.test.ts +125 -0
- package/src/commands/__tests__/run.test.ts +192 -0
- package/src/commands/__tests__/test-move.test.ts +81 -0
- package/src/commands/__tests__/test.test.ts +204 -0
- package/src/commands/__tests__/update.test.ts +223 -0
- package/src/commands/compile.ts +168 -32
- package/src/commands/fork/__tests__/create.test.ts +132 -0
- package/src/commands/fork/__tests__/fund.test.ts +104 -0
- package/src/commands/fork/__tests__/list.test.ts +139 -0
- package/src/commands/fork/__tests__/serve.test.ts +121 -0
- package/src/commands/fork/__tests__/view-resource.test.ts +101 -0
- package/src/commands/fork/create.ts +4 -3
- package/src/commands/fork/fund.ts +16 -9
- package/src/commands/fork/list.ts +3 -2
- package/src/commands/fork/serve.ts +6 -3
- package/src/commands/fork/view-resource.ts +11 -6
- package/src/commands/run.ts +54 -28
- package/src/commands/test-move.ts +4 -3
- package/src/commands/test.ts +56 -44
- package/src/commands/update.ts +19 -16
- package/src/core/AccountManager.ts +23 -10
- package/src/core/Publisher.ts +322 -0
- package/src/core/__tests__/AccountManager.test.ts +290 -0
- package/src/core/__tests__/config.test.ts +377 -0
- package/src/core/__tests__/deployments.test.ts +247 -0
- package/src/core/__tests__/shell.test.ts +138 -0
- package/src/core/config.ts +96 -12
- package/src/core/contract.ts +13 -4
- package/src/core/deployments.ts +13 -11
- package/src/core/movementProfile.ts +179 -0
- package/src/core/shell.ts +34 -14
- package/src/errors.ts +60 -0
- package/src/fork/__tests__/manager.test.ts +385 -0
- package/src/fork/__tests__/server.test.ts +65 -0
- package/src/fork/__tests__/storage.test.ts +281 -0
- package/src/fork/__tests__/test.test.ts +97 -0
- package/src/fork/api.ts +28 -14
- package/src/fork/manager.ts +88 -43
- package/src/fork/server.ts +53 -19
- package/src/fork/storage.ts +12 -15
- package/src/fork/test.ts +58 -32
- package/src/harness/Harness.ts +228 -0
- package/src/harness/codeObject.ts +388 -0
- package/src/harness/errors.ts +22 -0
- package/src/harness/index.ts +3 -0
- package/src/harness/proxy.ts +40 -0
- package/src/harness/script.ts +196 -0
- package/src/harness/view.ts +34 -0
- package/src/helpers/__tests__/semver-utils.test.ts +121 -0
- package/src/helpers/index.ts +2 -8
- package/src/helpers/move-tests.ts +27 -23
- package/src/helpers/npm-registry.ts +4 -3
- package/src/helpers/semver-utils.ts +4 -3
- package/src/helpers/setup.ts +9 -5
- package/src/helpers/setupLocalTesting.ts +219 -200
- package/src/helpers/testFixtures.ts +106 -118
- package/src/index.ts +9 -3
- package/src/node/LocalNodeManager.ts +87 -62
- package/src/node/__tests__/LocalNodeManager.test.ts +452 -0
- package/src/runtime.ts +33 -289
- package/src/templates/README.md +1 -1
- package/src/templates/movehat.config.ts +10 -0
- package/src/templates/package.json +2 -1
- package/src/templates/scripts/deploy-counter.ts +46 -38
- package/src/templates/tests/Counter.test.ts +51 -51
- package/src/templates/types/movehat.d.ts +6 -9
- package/src/types/config.ts +8 -0
- package/src/types/fork.ts +7 -1
- package/src/types/harness.ts +182 -0
- package/src/types/runtime.ts +11 -3
- package/src/ui/__tests__/colors.test.ts +156 -0
- package/src/ui/colors.ts +5 -2
- package/src/ui/logger.ts +22 -0
- package/src/ui/symbols.ts +7 -1
- package/src/utils/__tests__/address.test.ts +93 -0
- package/src/utils/__tests__/childProcessAdapter.test.ts +266 -0
- package/src/utils/__tests__/runCli.test.ts +240 -0
- package/src/utils/address.ts +56 -0
- package/src/utils/childProcessAdapter.ts +215 -0
- package/src/utils/parseCliOutput.ts +27 -0
- package/src/utils/redact.ts +24 -0
- package/src/utils/runCli.ts +64 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { spawn } from "child_process";
|
|
2
1
|
import { existsSync, rmSync } from "fs";
|
|
3
2
|
import { join } from "path";
|
|
3
|
+
import { defaultChildProcessAdapter, } from "../utils/childProcessAdapter.js";
|
|
4
|
+
import { logger } from "../ui/index.js";
|
|
4
5
|
/**
|
|
5
6
|
* Manages the lifecycle of a local Movement node
|
|
6
7
|
*
|
|
@@ -11,10 +12,13 @@ import { join } from "path";
|
|
|
11
12
|
* - Cleanup on shutdown
|
|
12
13
|
*/
|
|
13
14
|
export class LocalNodeManager {
|
|
14
|
-
|
|
15
|
+
spawned = null;
|
|
16
|
+
killed = false;
|
|
15
17
|
options;
|
|
18
|
+
adapter;
|
|
16
19
|
starting = false;
|
|
17
20
|
constructor(options = {}) {
|
|
21
|
+
this.adapter = options.adapter ?? defaultChildProcessAdapter;
|
|
18
22
|
this.options = {
|
|
19
23
|
testDir: options.testDir || join(process.cwd(), ".movehat", "local-node"),
|
|
20
24
|
forceRestart: options.forceRestart ?? false,
|
|
@@ -30,7 +34,7 @@ export class LocalNodeManager {
|
|
|
30
34
|
* @returns LocalNodeInfo with connection details
|
|
31
35
|
*/
|
|
32
36
|
async start() {
|
|
33
|
-
if (this.
|
|
37
|
+
if (this.spawned) {
|
|
34
38
|
console.log("Local node already running");
|
|
35
39
|
return this.getNodeInfo();
|
|
36
40
|
}
|
|
@@ -39,14 +43,16 @@ export class LocalNodeManager {
|
|
|
39
43
|
}
|
|
40
44
|
this.starting = true;
|
|
41
45
|
try {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
logger.newline();
|
|
47
|
+
logger.step("Starting local Movement node...");
|
|
48
|
+
logger.plain(` Test directory: ${this.options.testDir}`);
|
|
49
|
+
logger.plain(` RPC port: ${this.options.apiPort}`);
|
|
50
|
+
logger.plain(` Faucet port: ${this.options.faucetPort}`);
|
|
51
|
+
logger.plain(` Ready port: ${this.options.readyPort}`);
|
|
52
|
+
logger.newline();
|
|
47
53
|
// Clean state if force restart
|
|
48
54
|
if (this.options.forceRestart && existsSync(this.options.testDir)) {
|
|
49
|
-
|
|
55
|
+
logger.step("Cleaning previous node state...");
|
|
50
56
|
rmSync(this.options.testDir, { recursive: true, force: true });
|
|
51
57
|
}
|
|
52
58
|
// Build command arguments
|
|
@@ -61,50 +67,53 @@ export class LocalNodeManager {
|
|
|
61
67
|
if (this.options.forceRestart) {
|
|
62
68
|
args.push("--force-restart");
|
|
63
69
|
}
|
|
64
|
-
// Start the node process
|
|
65
|
-
this.
|
|
70
|
+
// Start the node process via the injectable adapter.
|
|
71
|
+
this.killed = false;
|
|
72
|
+
this.spawned = this.adapter.spawn({
|
|
73
|
+
command: "movement",
|
|
74
|
+
args,
|
|
66
75
|
stdio: this.options.silent ? "ignore" : "pipe",
|
|
67
|
-
detached: false,
|
|
68
76
|
});
|
|
69
77
|
// Handle process output
|
|
70
|
-
if (!this.options.silent && this.
|
|
71
|
-
this.
|
|
78
|
+
if (!this.options.silent && this.spawned.stdout && this.spawned.stderr) {
|
|
79
|
+
this.spawned.stdout.on("data", (data) => {
|
|
72
80
|
const output = data.toString().trim();
|
|
73
81
|
if (output) {
|
|
74
82
|
console.log(`[Node] ${output}`);
|
|
75
83
|
}
|
|
76
84
|
});
|
|
77
|
-
this.
|
|
85
|
+
this.spawned.stderr.on("data", (data) => {
|
|
78
86
|
const output = data.toString().trim();
|
|
79
87
|
if (output && !output.includes("WARN")) {
|
|
80
88
|
console.error(`[Node Error] ${output}`);
|
|
81
89
|
}
|
|
82
90
|
});
|
|
83
91
|
}
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
92
|
+
// The adapter's `exited` promise settles on both natural exit and on
|
|
93
|
+
// spawn-time error (e.g. ENOENT). On error the code is `null` — we don't
|
|
94
|
+
// log a generic "spawn failed" message here because `waitForReady` will
|
|
95
|
+
// surface a detailed timeout-with-hints error if movement never starts.
|
|
96
|
+
void this.spawned.exited.then(({ code }) => {
|
|
97
|
+
if (code !== null && code !== 0) {
|
|
98
|
+
logger.error(`Local node exited with code ${code}`);
|
|
88
99
|
}
|
|
89
|
-
this.
|
|
90
|
-
});
|
|
91
|
-
this.process.on("error", (error) => {
|
|
92
|
-
console.error(`\n❌ Failed to start local node: ${error.message}`);
|
|
93
|
-
this.process = null;
|
|
100
|
+
this.spawned = null;
|
|
94
101
|
});
|
|
95
102
|
// Wait for node to be ready
|
|
96
|
-
|
|
103
|
+
logger.step("Waiting for node to be ready...");
|
|
97
104
|
await this.waitForReady(60000); // 60 second timeout
|
|
98
|
-
|
|
105
|
+
logger.success("Local Movement node is ready!");
|
|
106
|
+
logger.newline();
|
|
99
107
|
this.starting = false;
|
|
100
108
|
return this.getNodeInfo();
|
|
101
109
|
}
|
|
102
110
|
catch (error) {
|
|
103
111
|
this.starting = false;
|
|
104
112
|
// Cleanup on failure
|
|
105
|
-
if (this.
|
|
106
|
-
this.
|
|
107
|
-
this.
|
|
113
|
+
if (this.spawned) {
|
|
114
|
+
this.killed = true;
|
|
115
|
+
this.spawned.kill();
|
|
116
|
+
this.spawned = null;
|
|
108
117
|
}
|
|
109
118
|
throw error;
|
|
110
119
|
}
|
|
@@ -113,36 +122,41 @@ export class LocalNodeManager {
|
|
|
113
122
|
* Stop the local node
|
|
114
123
|
*/
|
|
115
124
|
async stop() {
|
|
116
|
-
if (!this.
|
|
125
|
+
if (!this.spawned) {
|
|
117
126
|
return;
|
|
118
127
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
128
|
+
logger.newline();
|
|
129
|
+
logger.step("Stopping local Movement node...");
|
|
130
|
+
const spawned = this.spawned;
|
|
131
|
+
// Mark killed synchronously so isRunning() reflects the intent right away,
|
|
132
|
+
// mirroring node's ChildProcess.killed semantics.
|
|
133
|
+
this.killed = true;
|
|
134
|
+
// Send SIGTERM for graceful shutdown
|
|
135
|
+
spawned.kill("SIGTERM");
|
|
136
|
+
// Force kill after 5 seconds if still running
|
|
137
|
+
const forceTimer = setTimeout(() => {
|
|
138
|
+
if (this.spawned === spawned) {
|
|
139
|
+
logger.warning("Force killing node...");
|
|
140
|
+
spawned.kill("SIGKILL");
|
|
124
141
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
}, 5000);
|
|
139
|
-
});
|
|
142
|
+
}, 5000);
|
|
143
|
+
try {
|
|
144
|
+
await spawned.exited;
|
|
145
|
+
logger.success("Local node stopped");
|
|
146
|
+
logger.newline();
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
clearTimeout(forceTimer);
|
|
150
|
+
if (this.spawned === spawned) {
|
|
151
|
+
this.spawned = null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
140
154
|
}
|
|
141
155
|
/**
|
|
142
156
|
* Check if the node is running
|
|
143
157
|
*/
|
|
144
158
|
isRunning() {
|
|
145
|
-
return this.
|
|
159
|
+
return this.spawned !== null && !this.killed;
|
|
146
160
|
}
|
|
147
161
|
/**
|
|
148
162
|
* Get node connection info
|
|
@@ -192,7 +206,7 @@ export class LocalNodeManager {
|
|
|
192
206
|
const address = typeof account === 'string'
|
|
193
207
|
? account
|
|
194
208
|
: account.accountAddress.toString();
|
|
195
|
-
// Use query parameters for
|
|
209
|
+
// Use query parameters for the Movement faucet
|
|
196
210
|
const faucetUrl = `http://127.0.0.1:${this.options.faucetPort}/mint?amount=${amount}&address=${address}`;
|
|
197
211
|
try {
|
|
198
212
|
const response = await fetch(faucetUrl, {
|
|
@@ -203,22 +217,25 @@ export class LocalNodeManager {
|
|
|
203
217
|
throw new Error(`Faucet request failed: ${errorText}`);
|
|
204
218
|
}
|
|
205
219
|
const result = await response.json();
|
|
206
|
-
|
|
220
|
+
logger.success(`Funded ${address} with ${amount} octas`, 2);
|
|
207
221
|
return result;
|
|
208
222
|
}
|
|
209
223
|
catch (error) {
|
|
210
|
-
|
|
224
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
225
|
+
throw new Error(`Failed to fund account: ${msg}`);
|
|
211
226
|
}
|
|
212
227
|
}
|
|
213
228
|
/**
|
|
214
229
|
* Fund multiple accounts in batch
|
|
215
230
|
*/
|
|
216
231
|
async fundAccounts(accounts, amount = 100_000_000) {
|
|
217
|
-
|
|
232
|
+
logger.newline();
|
|
233
|
+
logger.step(`Funding ${accounts.length} accounts from local faucet...`);
|
|
218
234
|
for (const account of accounts) {
|
|
219
235
|
await this.fundAccount(account, amount);
|
|
220
236
|
}
|
|
221
|
-
|
|
237
|
+
logger.success("All accounts funded successfully");
|
|
238
|
+
logger.newline();
|
|
222
239
|
}
|
|
223
240
|
/**
|
|
224
241
|
* Clean up node data directory
|
|
@@ -228,9 +245,9 @@ export class LocalNodeManager {
|
|
|
228
245
|
throw new Error("Cannot clean while node is running. Stop the node first.");
|
|
229
246
|
}
|
|
230
247
|
if (existsSync(this.options.testDir)) {
|
|
231
|
-
|
|
248
|
+
logger.step(`Cleaning node data at ${this.options.testDir}...`);
|
|
232
249
|
rmSync(this.options.testDir, { recursive: true, force: true });
|
|
233
|
-
|
|
250
|
+
logger.success("Node data cleaned");
|
|
234
251
|
}
|
|
235
252
|
}
|
|
236
253
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalNodeManager.js","sourceRoot":"","sources":["../../src/node/LocalNodeManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"LocalNodeManager.js","sourceRoot":"","sources":["../../src/node/LocalNodeManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EACL,0BAA0B,GAG3B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAuBxC;;;;;;;;GAQG;AACH,MAAM,OAAO,gBAAgB;IACnB,OAAO,GAA0B,IAAI,CAAC;IACtC,MAAM,GAAG,KAAK,CAAC;IACf,OAAO,CAA8C;IAC5C,OAAO,CAAsB;IACtC,QAAQ,GAAY,KAAK,CAAC;IAElC,YAAY,UAA4B,EAAE;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,0BAA0B,CAAC;QAC7D,IAAI,CAAC,OAAO,GAAG;YACb,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,YAAY,CAAC;YACzE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK;YAC3C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;YACpC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;SAChC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,EAAE,CAAC;YAEjB,+BAA+B;YAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClE,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,0BAA0B;YAC1B,MAAM,IAAI,GAAG;gBACX,MAAM;gBACN,cAAc;gBACd,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAClC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE;gBACnD,4BAA4B,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE;gBAC/D,cAAc,EAAE,sBAAsB;aACvC,CAAC;YAEF,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC/B,CAAC;YAED,qDAAqD;YACrD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBAChC,OAAO,EAAE,UAAU;gBACnB,IAAI;gBACJ,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;aAC/C,CAAC,CAAC;YAEH,wBAAwB;YACxB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACvE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;oBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;oBACtC,IAAI,MAAM,EAAE,CAAC;wBACX,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;oBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;oBACtC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;wBACvC,OAAO,CAAC,KAAK,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,qEAAqE;YACrE,yEAAyE;YACzE,wEAAwE;YACxE,wEAAwE;YACxE,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;gBACzC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBAChC,MAAM,CAAC,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;gBACtD,CAAC;gBACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,4BAA4B;YAC5B,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAC/C,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB;YAEpD,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,EAAE,CAAC;YAEjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAE5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YAEtB,qBAAqB;YACrB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAE7B,2EAA2E;QAC3E,kDAAkD;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,qCAAqC;QACrC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAExB,8CAA8C;QAC9C,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC7B,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAAC;YACrB,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,UAAU,CAAC,CAAC;YACzB,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO;YACL,MAAM,EAAE,oBAAoB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAClD,SAAS,EAAE,oBAAoB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YACxD,QAAQ,EAAE,oBAAoB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YACtD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;SAC9B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,YAAoB,KAAK;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,oBAAoB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAE9D,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAEvC,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChB,OAAO,CAAC,iBAAiB;gBAC3B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,uCAAuC;YACzC,CAAC;YAED,kCAAkC;YAClC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,KAAK,CACb,0CAA0C,SAAS,GAAG,IAAI,YAAY;YACtE,oDAAoD,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI;YAC5E,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,iBAAiB,CAC3E,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,OAAyB,EAAE,SAAiB,WAAW;QACvE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,yCAAyC;QACzC,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK,QAAQ;YACzC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QAEtC,+CAA+C;QAC/C,MAAM,SAAS,GAAG,oBAAoB,IAAI,CAAC,OAAO,CAAC,UAAU,gBAAgB,MAAM,YAAY,OAAO,EAAE,CAAC;QAEzG,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;gBACtC,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,UAAU,OAAO,SAAS,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC;YAE5D,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,QAA8B,EAAE,SAAiB,WAAW;QAC7E,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,MAAM,gCAAgC,CAAC,CAAC;QAExE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalNodeManager.test.d.ts","sourceRoot":"","sources":["../../../src/node/__tests__/LocalNodeManager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { PassThrough } from "node:stream";
|
|
3
|
+
import { mkdtempSync, rmSync, existsSync, mkdirSync } from "node:fs";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { LocalNodeManager } from "../LocalNodeManager.js";
|
|
7
|
+
function buildFakeSpawned() {
|
|
8
|
+
const stdout = new PassThrough();
|
|
9
|
+
const stderr = new PassThrough();
|
|
10
|
+
const stdin = new PassThrough();
|
|
11
|
+
let exitResolve;
|
|
12
|
+
const exited = new Promise((resolve) => {
|
|
13
|
+
exitResolve = resolve;
|
|
14
|
+
});
|
|
15
|
+
let killed = false;
|
|
16
|
+
const proc = {
|
|
17
|
+
pid: 4242,
|
|
18
|
+
stdout,
|
|
19
|
+
stderr,
|
|
20
|
+
stdin,
|
|
21
|
+
kill: (_signal) => {
|
|
22
|
+
if (killed)
|
|
23
|
+
return false;
|
|
24
|
+
killed = true;
|
|
25
|
+
// Resolve `exited` shortly after kill so `stop()` doesn't hang.
|
|
26
|
+
setImmediate(() => exitResolve({ code: null, signal: _signal ?? "SIGTERM" }));
|
|
27
|
+
return true;
|
|
28
|
+
},
|
|
29
|
+
exited,
|
|
30
|
+
__exit: (code, signal) => exitResolve({ code, signal }),
|
|
31
|
+
};
|
|
32
|
+
return proc;
|
|
33
|
+
}
|
|
34
|
+
function buildFakeAdapter() {
|
|
35
|
+
const calls = [];
|
|
36
|
+
const spawned = [];
|
|
37
|
+
const adapter = {
|
|
38
|
+
run: vi.fn(),
|
|
39
|
+
spawn: (input) => {
|
|
40
|
+
calls.push(input);
|
|
41
|
+
const proc = buildFakeSpawned();
|
|
42
|
+
spawned.push(proc);
|
|
43
|
+
return proc;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
return { adapter, calls, spawned };
|
|
47
|
+
}
|
|
48
|
+
function stubFetchOnce(response) {
|
|
49
|
+
const fn = vi.fn().mockResolvedValueOnce(response);
|
|
50
|
+
vi.stubGlobal("fetch", fn);
|
|
51
|
+
return fn;
|
|
52
|
+
}
|
|
53
|
+
function stubFetchAlwaysOk() {
|
|
54
|
+
const fn = vi.fn().mockResolvedValue({ ok: true, json: async () => ({}) });
|
|
55
|
+
vi.stubGlobal("fetch", fn);
|
|
56
|
+
return fn;
|
|
57
|
+
}
|
|
58
|
+
describe("LocalNodeManager — start / stop / lifecycle", () => {
|
|
59
|
+
let tmpDir;
|
|
60
|
+
let logSpy;
|
|
61
|
+
let errSpy;
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
tmpDir = mkdtempSync(join(tmpdir(), "movehat-localnode-"));
|
|
64
|
+
// The logger prints to stdout/stderr; silence the noise for cleaner test output.
|
|
65
|
+
logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined);
|
|
66
|
+
errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
67
|
+
});
|
|
68
|
+
afterEach(() => {
|
|
69
|
+
vi.restoreAllMocks();
|
|
70
|
+
vi.unstubAllGlobals();
|
|
71
|
+
if (existsSync(tmpDir)) {
|
|
72
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
it("constructs with sensible defaults from getNodeInfo", () => {
|
|
76
|
+
const { adapter } = buildFakeAdapter();
|
|
77
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir });
|
|
78
|
+
const info = mgr.getNodeInfo();
|
|
79
|
+
expect(info.rpcUrl).toBe("http://127.0.0.1:8080");
|
|
80
|
+
expect(info.faucetUrl).toBe("http://127.0.0.1:8081");
|
|
81
|
+
expect(info.readyUrl).toBe("http://127.0.0.1:8070");
|
|
82
|
+
expect(info.testDir).toBe(tmpDir);
|
|
83
|
+
});
|
|
84
|
+
it("honors custom ports from constructor options", () => {
|
|
85
|
+
const { adapter } = buildFakeAdapter();
|
|
86
|
+
const mgr = new LocalNodeManager({
|
|
87
|
+
adapter,
|
|
88
|
+
testDir: tmpDir,
|
|
89
|
+
apiPort: 9000,
|
|
90
|
+
faucetPort: 9001,
|
|
91
|
+
readyPort: 9002,
|
|
92
|
+
});
|
|
93
|
+
const info = mgr.getNodeInfo();
|
|
94
|
+
expect(info.rpcUrl).toContain(":9000");
|
|
95
|
+
expect(info.faucetUrl).toContain(":9001");
|
|
96
|
+
expect(info.readyUrl).toContain(":9002");
|
|
97
|
+
});
|
|
98
|
+
it("isRunning reports false before start", () => {
|
|
99
|
+
const { adapter } = buildFakeAdapter();
|
|
100
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir });
|
|
101
|
+
expect(mgr.isRunning()).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
it("start spawns 'movement node run-localnet' with the expected args", async () => {
|
|
104
|
+
const { adapter, calls } = buildFakeAdapter();
|
|
105
|
+
stubFetchAlwaysOk();
|
|
106
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
|
|
107
|
+
await mgr.start();
|
|
108
|
+
expect(calls).toHaveLength(1);
|
|
109
|
+
expect(calls[0]?.command).toBe("movement");
|
|
110
|
+
const args = calls[0]?.args ?? [];
|
|
111
|
+
expect(args.slice(0, 2)).toEqual(["node", "run-localnet"]);
|
|
112
|
+
expect(args).toContain("--test-dir");
|
|
113
|
+
expect(args).toContain(tmpDir);
|
|
114
|
+
expect(args).toContain("--faucet-port");
|
|
115
|
+
expect(args).toContain("8081");
|
|
116
|
+
expect(args).toContain("--assume-yes");
|
|
117
|
+
expect(mgr.isRunning()).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
it("start in silent mode does not wire stdout/stderr listeners", async () => {
|
|
120
|
+
const { adapter, spawned } = buildFakeAdapter();
|
|
121
|
+
stubFetchAlwaysOk();
|
|
122
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
|
|
123
|
+
await mgr.start();
|
|
124
|
+
// The PassThrough streams should have no `data` listeners attached
|
|
125
|
+
// when `silent: true` is set.
|
|
126
|
+
const proc = spawned[0];
|
|
127
|
+
expect(proc.stdout.listenerCount("data")).toBe(0);
|
|
128
|
+
expect(proc.stderr.listenerCount("data")).toBe(0);
|
|
129
|
+
});
|
|
130
|
+
it("start in non-silent mode wires stdout/stderr listeners that log events", async () => {
|
|
131
|
+
const { adapter, spawned } = buildFakeAdapter();
|
|
132
|
+
stubFetchAlwaysOk();
|
|
133
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: false });
|
|
134
|
+
await mgr.start();
|
|
135
|
+
const proc = spawned[0];
|
|
136
|
+
expect(proc.stdout.listenerCount("data")).toBeGreaterThan(0);
|
|
137
|
+
expect(proc.stderr.listenerCount("data")).toBeGreaterThan(0);
|
|
138
|
+
// Drive a line through stdout — the manager's listener forwards to console.log.
|
|
139
|
+
proc.stdout.emit("data", Buffer.from("local node ready\n"));
|
|
140
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("local node ready"));
|
|
141
|
+
// stderr non-WARN line goes through console.error.
|
|
142
|
+
proc.stderr.emit("data", Buffer.from("real error\n"));
|
|
143
|
+
expect(errSpy).toHaveBeenCalledWith(expect.stringContaining("real error"));
|
|
144
|
+
// stderr WARN line should be filtered (no error log).
|
|
145
|
+
errSpy.mockClear();
|
|
146
|
+
proc.stderr.emit("data", Buffer.from("WARN something\n"));
|
|
147
|
+
expect(errSpy).not.toHaveBeenCalledWith(expect.stringContaining("WARN"));
|
|
148
|
+
});
|
|
149
|
+
it("force-restart cleans the test directory before spawn", async () => {
|
|
150
|
+
const { adapter } = buildFakeAdapter();
|
|
151
|
+
stubFetchAlwaysOk();
|
|
152
|
+
const planted = join(tmpDir, "stale-file.txt");
|
|
153
|
+
// Create a stale file to prove the cleanup actually removes it.
|
|
154
|
+
mkdirSync(tmpDir, { recursive: true });
|
|
155
|
+
require("node:fs").writeFileSync(planted, "stale");
|
|
156
|
+
expect(existsSync(planted)).toBe(true);
|
|
157
|
+
const mgr = new LocalNodeManager({
|
|
158
|
+
adapter,
|
|
159
|
+
testDir: tmpDir,
|
|
160
|
+
forceRestart: true,
|
|
161
|
+
silent: true,
|
|
162
|
+
});
|
|
163
|
+
await mgr.start();
|
|
164
|
+
expect(existsSync(planted)).toBe(false);
|
|
165
|
+
});
|
|
166
|
+
it("force-restart appends --force-restart to the CLI args", async () => {
|
|
167
|
+
const { adapter, calls } = buildFakeAdapter();
|
|
168
|
+
stubFetchAlwaysOk();
|
|
169
|
+
const mgr = new LocalNodeManager({
|
|
170
|
+
adapter,
|
|
171
|
+
testDir: tmpDir,
|
|
172
|
+
forceRestart: true,
|
|
173
|
+
silent: true,
|
|
174
|
+
});
|
|
175
|
+
await mgr.start();
|
|
176
|
+
expect(calls[0]?.args).toContain("--force-restart");
|
|
177
|
+
});
|
|
178
|
+
it("calling start twice returns the same node info (idempotent)", async () => {
|
|
179
|
+
const { adapter, calls } = buildFakeAdapter();
|
|
180
|
+
stubFetchAlwaysOk();
|
|
181
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
|
|
182
|
+
const info1 = await mgr.start();
|
|
183
|
+
const info2 = await mgr.start();
|
|
184
|
+
expect(info2).toEqual(info1);
|
|
185
|
+
expect(calls).toHaveLength(1);
|
|
186
|
+
});
|
|
187
|
+
it("stop signals SIGTERM and clears the spawned handle", async () => {
|
|
188
|
+
const { adapter, spawned } = buildFakeAdapter();
|
|
189
|
+
stubFetchAlwaysOk();
|
|
190
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
|
|
191
|
+
await mgr.start();
|
|
192
|
+
const killSpy = vi.spyOn(spawned[0], "kill");
|
|
193
|
+
await mgr.stop();
|
|
194
|
+
expect(killSpy).toHaveBeenCalledWith("SIGTERM");
|
|
195
|
+
expect(mgr.isRunning()).toBe(false);
|
|
196
|
+
});
|
|
197
|
+
it("stop is a no-op when no node is running", async () => {
|
|
198
|
+
const { adapter } = buildFakeAdapter();
|
|
199
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir });
|
|
200
|
+
// Should not throw.
|
|
201
|
+
await mgr.stop();
|
|
202
|
+
expect(mgr.isRunning()).toBe(false);
|
|
203
|
+
});
|
|
204
|
+
it("clean refuses while the node is running", async () => {
|
|
205
|
+
const { adapter } = buildFakeAdapter();
|
|
206
|
+
stubFetchAlwaysOk();
|
|
207
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
|
|
208
|
+
await mgr.start();
|
|
209
|
+
await expect(mgr.clean()).rejects.toThrow(/Cannot clean while node is running/);
|
|
210
|
+
});
|
|
211
|
+
it("clean removes the test directory after stop", async () => {
|
|
212
|
+
const { adapter } = buildFakeAdapter();
|
|
213
|
+
stubFetchAlwaysOk();
|
|
214
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
|
|
215
|
+
await mgr.start();
|
|
216
|
+
await mgr.stop();
|
|
217
|
+
expect(existsSync(tmpDir)).toBe(true);
|
|
218
|
+
await mgr.clean();
|
|
219
|
+
expect(existsSync(tmpDir)).toBe(false);
|
|
220
|
+
});
|
|
221
|
+
it("clean is a no-op when the test directory doesn't exist", async () => {
|
|
222
|
+
const { adapter } = buildFakeAdapter();
|
|
223
|
+
const missing = join(tmpDir, "never-created");
|
|
224
|
+
const mgr = new LocalNodeManager({ adapter, testDir: missing });
|
|
225
|
+
// Should not throw.
|
|
226
|
+
await mgr.clean();
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
describe("LocalNodeManager — start failure paths", () => {
|
|
230
|
+
let tmpDir;
|
|
231
|
+
beforeEach(() => {
|
|
232
|
+
tmpDir = mkdtempSync(join(tmpdir(), "movehat-localnode-"));
|
|
233
|
+
vi.spyOn(console, "log").mockImplementation(() => undefined);
|
|
234
|
+
vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
235
|
+
});
|
|
236
|
+
afterEach(() => {
|
|
237
|
+
vi.restoreAllMocks();
|
|
238
|
+
vi.unstubAllGlobals();
|
|
239
|
+
if (existsSync(tmpDir))
|
|
240
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
241
|
+
});
|
|
242
|
+
it("waitForReady timeout surfaces a clear error AND cleans up the spawn", async () => {
|
|
243
|
+
const { adapter, spawned } = buildFakeAdapter();
|
|
244
|
+
// Always-failing fetch — node never becomes ready.
|
|
245
|
+
vi.stubGlobal("fetch", vi.fn().mockRejectedValue(new Error("ECONNREFUSED")));
|
|
246
|
+
vi.useFakeTimers();
|
|
247
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
|
|
248
|
+
// Attach the .catch handler synchronously so the eventual rejection
|
|
249
|
+
// never lands as an unhandled promise. vi.advanceTimersByTimeAsync
|
|
250
|
+
// drives the waitForReady loop forward; we then await the captured
|
|
251
|
+
// error and assert on it.
|
|
252
|
+
let captured;
|
|
253
|
+
const startPromise = mgr.start().catch((e) => {
|
|
254
|
+
captured = e;
|
|
255
|
+
});
|
|
256
|
+
// Drive the 60s timeout forward — each loop iteration does fetch +
|
|
257
|
+
// sleep(1000). Advance well past 60 000 ms.
|
|
258
|
+
await vi.advanceTimersByTimeAsync(61_000);
|
|
259
|
+
await startPromise;
|
|
260
|
+
expect(captured).toBeInstanceOf(Error);
|
|
261
|
+
expect(captured.message).toMatch(/did not become ready/);
|
|
262
|
+
// The spawn handle must have been killed in the catch arm.
|
|
263
|
+
expect(spawned[0]).toBeDefined();
|
|
264
|
+
expect(mgr.isRunning()).toBe(false);
|
|
265
|
+
vi.useRealTimers();
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
describe("LocalNodeManager — fundAccount", () => {
|
|
269
|
+
let tmpDir;
|
|
270
|
+
beforeEach(() => {
|
|
271
|
+
tmpDir = mkdtempSync(join(tmpdir(), "movehat-localnode-"));
|
|
272
|
+
vi.spyOn(console, "log").mockImplementation(() => undefined);
|
|
273
|
+
vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
274
|
+
});
|
|
275
|
+
afterEach(() => {
|
|
276
|
+
vi.restoreAllMocks();
|
|
277
|
+
vi.unstubAllGlobals();
|
|
278
|
+
if (existsSync(tmpDir))
|
|
279
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
280
|
+
});
|
|
281
|
+
it("rejects when called before the node is running", async () => {
|
|
282
|
+
const { adapter } = buildFakeAdapter();
|
|
283
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir });
|
|
284
|
+
await expect(mgr.fundAccount("0xabc", 100)).rejects.toThrow(/Local node is not running/);
|
|
285
|
+
});
|
|
286
|
+
it("posts to the faucet endpoint and returns the parsed JSON on success", async () => {
|
|
287
|
+
const { adapter } = buildFakeAdapter();
|
|
288
|
+
// First fetch = ready check; subsequent = faucet mint.
|
|
289
|
+
const fetchFn = vi.fn();
|
|
290
|
+
fetchFn.mockResolvedValueOnce({ ok: true }); // waitForReady
|
|
291
|
+
fetchFn.mockResolvedValueOnce({
|
|
292
|
+
ok: true,
|
|
293
|
+
json: async () => ({ txn_hashes: ["0xdeadbeef"] }),
|
|
294
|
+
}); // faucet
|
|
295
|
+
vi.stubGlobal("fetch", fetchFn);
|
|
296
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
|
|
297
|
+
await mgr.start();
|
|
298
|
+
const addr = "0x" + "1".repeat(64);
|
|
299
|
+
const result = await mgr.fundAccount(addr, 12345);
|
|
300
|
+
expect(result).toEqual({ txn_hashes: ["0xdeadbeef"] });
|
|
301
|
+
const faucetCall = fetchFn.mock.calls[1];
|
|
302
|
+
expect(faucetCall[0]).toContain("/mint?amount=12345&address=" + addr);
|
|
303
|
+
expect(faucetCall[1]?.method).toBe("POST");
|
|
304
|
+
});
|
|
305
|
+
it("rethrows a clear error when the faucet returns non-ok", async () => {
|
|
306
|
+
const { adapter } = buildFakeAdapter();
|
|
307
|
+
const fetchFn = vi.fn();
|
|
308
|
+
fetchFn.mockResolvedValueOnce({ ok: true }); // waitForReady
|
|
309
|
+
fetchFn.mockResolvedValueOnce({
|
|
310
|
+
ok: false,
|
|
311
|
+
text: async () => "out of funds",
|
|
312
|
+
json: async () => ({}),
|
|
313
|
+
});
|
|
314
|
+
vi.stubGlobal("fetch", fetchFn);
|
|
315
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
|
|
316
|
+
await mgr.start();
|
|
317
|
+
await expect(mgr.fundAccount("0xabc", 100)).rejects.toThrow(/Failed to fund account.*out of funds/);
|
|
318
|
+
});
|
|
319
|
+
it("fundAccount accepts an Account-like object by reading accountAddress.toString()", async () => {
|
|
320
|
+
const { adapter } = buildFakeAdapter();
|
|
321
|
+
const fetchFn = vi.fn();
|
|
322
|
+
fetchFn.mockResolvedValueOnce({ ok: true }); // waitForReady
|
|
323
|
+
fetchFn.mockResolvedValueOnce({
|
|
324
|
+
ok: true,
|
|
325
|
+
json: async () => ({}),
|
|
326
|
+
});
|
|
327
|
+
vi.stubGlobal("fetch", fetchFn);
|
|
328
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
|
|
329
|
+
await mgr.start();
|
|
330
|
+
const fakeAccount = {
|
|
331
|
+
accountAddress: { toString: () => "0xfeedbeef" },
|
|
332
|
+
}; // exercises the typeof-not-string branch
|
|
333
|
+
await mgr.fundAccount(fakeAccount, 100);
|
|
334
|
+
expect(fetchFn.mock.calls[1][0]).toContain("address=0xfeedbeef");
|
|
335
|
+
});
|
|
336
|
+
it("fundAccounts iterates and funds each account in turn", async () => {
|
|
337
|
+
const { adapter } = buildFakeAdapter();
|
|
338
|
+
const fetchFn = vi.fn();
|
|
339
|
+
fetchFn.mockResolvedValueOnce({ ok: true }); // waitForReady
|
|
340
|
+
fetchFn.mockResolvedValue({ ok: true, json: async () => ({}) });
|
|
341
|
+
vi.stubGlobal("fetch", fetchFn);
|
|
342
|
+
const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
|
|
343
|
+
await mgr.start();
|
|
344
|
+
await mgr.fundAccounts(["0x1", "0x2", "0x3"], 100);
|
|
345
|
+
// 1 ready + 3 mint calls = 4 total.
|
|
346
|
+
expect(fetchFn.mock.calls.length).toBeGreaterThanOrEqual(4);
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
//# sourceMappingURL=LocalNodeManager.test.js.map
|