UNPKG

farmbot

Version:
264 lines (263 loc) 10.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** Too hard to make assertions when every call to bot.send() * generates a non-deterministic UUID. * * Stubs out uuid() calls to always be the same. */ jest.mock("../util/uuid", function () { return ({ uuid: function () { return "FAKE_UUID"; } }); }); var __1 = require(".."); var test_support_1 = require("../test_support"); var config_1 = require("../config"); var constants_1 = require("../constants"); var rpc_request_1 = require("../util/rpc_request"); describe("FarmBot", function () { var token = test_support_1.FAKE_TOKEN; it("creates RPCs", function () { [rpc_request_1.Priority.HIGHEST, rpc_request_1.Priority.LOWEST].map(function (priority) { var x = (0, rpc_request_1.rpcRequest)([], priority); expect(x.args.priority).toEqual(priority); }); var x = (0, rpc_request_1.rpcRequest)([]); expect(x.args.priority).toEqual(rpc_request_1.Priority.NORMAL); }); it("Instantiates a FarmBot", function () { var bot = (0, test_support_1.fakeFarmbot)(); expect(bot.getConfig("token")).toEqual(token); expect(bot.getConfig("speed")).toEqual(100); expect(bot.getConfig("secure")).toEqual(false); }); it("disallows publishing when disconnected", function () { var bot = (0, test_support_1.fakeFarmbot)(); bot.client = undefined; var boom = function () { return bot.publish({ kind: "rpc_request", args: { label: "nope", priority: 0 }, body: [] }); }; expect(boom).toThrowError("Not connected to server"); }); it("uses the bot object to *BROADCAST* simple RPCs", function () { var bot = (0, test_support_1.fakeFarmbot)(); var fakeSender = jest.fn(); bot.publish = fakeSender; var expectations = [ [ bot.resetOS, { kind: "factory_reset", args: { package: "farmbot_os" } } ], [ bot.resetMCU, { kind: "factory_reset", args: { package: "arduino_firmware" } } ], [ bot.reboot, { kind: "reboot", args: { package: "farmbot_os" } } ], [ bot.rebootFirmware, { kind: "reboot", args: { package: "arduino_firmware" } } ], [ function () { return bot.flashFirmware("foo"); }, { kind: "flash_firmware", args: { package: "foo" } } ], [ function () { return bot.setServoAngle({ pin_number: 4, pin_value: 6 }); }, { kind: "set_servo_angle", args: { pin_number: 4, pin_value: 6 } } ], [ function () { return bot.calibrate({ axis: "all" }); }, { kind: "calibrate", args: { axis: "all" } } ] ]; expectations.map(function (_a) { var rpc = _a[0], xpectArgs = _a[1]; fakeSender.mockClear(); rpc(false); expect(fakeSender).toHaveBeenCalledWith((0, rpc_request_1.rpcRequest)([xpectArgs])); }); }); it("sets config values", function () { var bot = (0, test_support_1.fakeFarmbot)(); bot.setConfig("speed", 12344); expect(bot.getConfig("speed")).toEqual(12344); }); it("has restriction on servos and angles", function () { var bot = (0, test_support_1.fakeFarmbot)(); var bad_pin = function () { return bot.setServoAngle({ pin_number: 0, pin_value: 90 }); }; var bad_angle = function () { return bot.setServoAngle({ pin_number: 4, pin_value: 900 }); }; expect(bad_angle).toThrowError("Pin value outside of 0...180 range"); expect(bad_pin).toThrowError("Servos only work on pins 4 and 5"); }); it("uses the bot object to *SEND* simple RPCs", function () { var bot = (0, test_support_1.fakeFarmbot)(); var fakeSender = jest.fn(); bot.publish = fakeSender; var expectations = [ [ bot.installFirstPartyFarmware, { kind: "install_first_party_farmware", args: {} } ], [ bot.checkUpdates, { kind: "check_updates", args: { package: "farmbot_os" } } ], [ bot.powerOff, { kind: "power_off", args: {} } ], [ bot.reboot, { kind: "reboot", args: { package: "farmbot_os" } } ] ]; expectations.map(function (_a) { var rpc = _a[0], xpectArgs = _a[1]; fakeSender.mockClear(); rpc(false); var x = (0, rpc_request_1.rpcRequest)([xpectArgs]); expect(fakeSender).toHaveBeenCalledWith(x); }); var hiPriority = [[ bot.emergencyLock, { kind: "emergency_lock", args: {} } ], [ bot.emergencyUnlock, { kind: "emergency_unlock", args: {} } ]]; hiPriority.map(function (_a) { var rpc = _a[0], xpectArgs = _a[1]; fakeSender.mockClear(); rpc(false); var x = (0, rpc_request_1.rpcRequest)([xpectArgs], rpc_request_1.Priority.HIGHEST); expect(fakeSender).toHaveBeenCalledWith(x); }); }); describe("configurable RPC logic", function () { var bot = (0, test_support_1.fakeFarmbot)(); var fakeSender = jest.fn(); bot.publish = fakeSender; beforeEach(function () { return fakeSender.mockClear(); }); function expectRPC(item) { expect(fakeSender).toHaveBeenCalledWith((0, rpc_request_1.rpcRequest)([item])); } it("installs Farmware", function () { var url = "foo.bar/manifest.json"; bot.installFarmware(url); expectRPC({ kind: "install_farmware", args: { url: url } }); }); it("updates Farmware", function () { var pkg = "a package"; bot.updateFarmware(pkg); expectRPC({ kind: "update_farmware", args: { package: pkg } }); }); it("removes Farmware", function () { var pkg = "farmbot_os"; bot.removeFarmware(pkg); expectRPC({ kind: "remove_farmware", args: { package: pkg } }); }); it("executes a sequence", function () { var sequence_id = 123; bot.execSequence(sequence_id); expectRPC({ kind: "execute", args: { sequence_id: sequence_id }, body: [] }); }); it("executes a script", function () { var label = "minesweeper.exe"; var envVars = [{ kind: "pair", args: { label: "is_pair", value: true } }]; bot.execScript(label, envVars); expectRPC({ kind: "execute_script", args: { label: label }, body: envVars }); }); it("moves to home position", function () { var args = { speed: 100, axis: "all" }; bot.home(args); expectRPC({ kind: "home", args: args }); }); it("finds home position", function () { var args = { speed: 100, axis: "all" }; bot.findHome(args); expectRPC({ kind: "find_home", args: args }); }); it("Moves to an absolute coord", function () { var _a = [1, 2, 3], x = _a[0], y = _a[1], z = _a[2]; bot.moveAbsolute({ x: x, y: y, z: z }); expectRPC({ kind: "move_absolute", args: { location: (0, __1.coordinate)(x, y, z), offset: (0, __1.coordinate)(0, 0, 0), speed: config_1.CONFIG_DEFAULTS.speed } }); }); it("Moves to a relative coord", function () { var _a = [1, 2, 3], x = _a[0], y = _a[1], z = _a[2]; bot.moveRelative({ x: x, y: y, z: z }); expectRPC({ kind: "move_relative", args: { x: x, y: y, z: z, speed: config_1.CONFIG_DEFAULTS.speed } }); }); it("writes a pin", function () { var args = { pin_mode: 1, pin_value: 128, pin_number: 8 }; bot.writePin(args); expectRPC({ kind: "write_pin", args: args }); }); it("reads a pin", function () { var args = { pin_mode: 1, pin_number: 8, label: "X" }; bot.readPin(args); expectRPC({ kind: "read_pin", args: args }); }); it("toggles a pin", function () { var pin_number = 13; var args = { pin_number: pin_number }; bot.togglePin(args); expectRPC({ kind: "toggle_pin", args: args }); }); it("reads the bot's status", function () { var args = {}; bot.readStatus(args); expectRPC({ kind: "read_status", args: args }); }); it("takes a photo", function () { var args = {}; bot.takePhoto(args); expectRPC({ kind: "take_photo", args: args }); }); it("syncs", function () { var args = {}; bot.sync(args); expectRPC({ kind: "sync", args: args }); }); it("sets zero", function () { var axis = "x"; bot.setZero(axis); expectRPC({ kind: "zero", args: { axis: axis } }); }); it("sets ENV vars", function () { var xmp = { foo: undefined, bar: "bz" }; bot.setUserEnv(xmp); expectRPC({ kind: "set_user_env", args: {}, body: [ { kind: "pair", args: { label: "foo", value: constants_1.Misc.NULL } }, { kind: "pair", args: { label: "bar", value: "bz" } }, ] }); }); }); });