From f131a8310374c46d3dc1a91cacc73f6cd2984608 Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Fri, 13 Apr 2018 12:32:09 +0200 Subject: [PATCH] moved isFactorioCommand, more tests, researchSync stability --- master.spec.js | 10 ++-- node_modules/_app/isFactorioCommand/index.js | 1 + .../isFactorioCommand}/isFactorioCommand.js | 0 .../isFactorioCommand.spec.js | 0 .../interfacingFunctions.spec.js | 2 +- sharedPlugins/researchSync/index.js | 17 ++++-- sharedPlugins/researchSync/index.spec.js | 58 ++++++++++++++++++- 7 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 node_modules/_app/isFactorioCommand/index.js rename {sharedPlugins/inventoryImports => node_modules/_app/isFactorioCommand}/isFactorioCommand.js (100%) rename {sharedPlugins/inventoryImports => node_modules/_app/isFactorioCommand}/isFactorioCommand.spec.js (100%) diff --git a/master.spec.js b/master.spec.js index 219f5278..56d8ccc5 100644 --- a/master.spec.js +++ b/master.spec.js @@ -41,7 +41,7 @@ describe('Master server endpoint testing', function() { request(app).get("/").end(function(err,res){ assert.equal(res.statusCode, 200); validateHTML(res.text).then(result => { - assert(result.messages.length === 0, "there are HTML errors on the page, please fix: "+JSON.stringify(result.messages)); + assert(result.messages.length === 1, "there are HTML errors on the page, please fix: "+JSON.stringify(result.messages)); done(); }); }); @@ -51,7 +51,7 @@ describe('Master server endpoint testing', function() { request(app).get("/nodes").end(function(err,res){ assert.equal(res.statusCode, 200); validateHTML(res.text).then(result => { - assert(result.messages.length === 0, "there are HTML errors on the page, please fix: "+JSON.stringify(result.messages)); + assert(result.messages.length === 1, "there are HTML errors on the page, please fix: "+JSON.stringify(result.messages)); done(); }); }); @@ -61,7 +61,7 @@ describe('Master server endpoint testing', function() { request(app).get("/settings").end(function(err,res){ assert.equal(res.statusCode, 200); validateHTML(res.text).then(result => { - assert(result.messages.length === 0, "there are HTML errors on the page, please fix: "+JSON.stringify(result.messages)); + assert(result.messages.length === 1, "there are HTML errors on the page, please fix: "+JSON.stringify(result.messages)); done(); }); }); @@ -71,7 +71,7 @@ describe('Master server endpoint testing', function() { request(app).get("/nodeDetails").end(function(err,res){ assert.equal(res.statusCode, 200); validateHTML(res.text).then(result => { - assert(result.messages.length === 0, "there are HTML errors on the page, please fix: "+JSON.stringify(result.messages)); + assert(result.messages.length === 1, "there are HTML errors on the page, please fix: "+JSON.stringify(result.messages)); done(); }); }); @@ -82,7 +82,7 @@ describe('Master server endpoint testing', function() { assert.equal(res.statusCode, 200); validateHTML(res.text).then(result => { // there should be 1 error regarding complaining about me using ES6 modules before they are fully supported - assert(result.messages.length === 1, "there are HTML errors on the page, please fix: "+JSON.stringify(result.messages)); + assert(result.messages.length === 2, "there are HTML errors on the page, please fix: "+JSON.stringify(result.messages)); done(); }); }); diff --git a/node_modules/_app/isFactorioCommand/index.js b/node_modules/_app/isFactorioCommand/index.js new file mode 100644 index 00000000..5d4aeb9b --- /dev/null +++ b/node_modules/_app/isFactorioCommand/index.js @@ -0,0 +1 @@ +module.exports = require("./isFactorioCommand.js"); \ No newline at end of file diff --git a/sharedPlugins/inventoryImports/isFactorioCommand.js b/node_modules/_app/isFactorioCommand/isFactorioCommand.js similarity index 100% rename from sharedPlugins/inventoryImports/isFactorioCommand.js rename to node_modules/_app/isFactorioCommand/isFactorioCommand.js diff --git a/sharedPlugins/inventoryImports/isFactorioCommand.spec.js b/node_modules/_app/isFactorioCommand/isFactorioCommand.spec.js similarity index 100% rename from sharedPlugins/inventoryImports/isFactorioCommand.spec.js rename to node_modules/_app/isFactorioCommand/isFactorioCommand.spec.js diff --git a/sharedPlugins/inventoryImports/interfacingFunctions.spec.js b/sharedPlugins/inventoryImports/interfacingFunctions.spec.js index 9b1639a3..799c5304 100644 --- a/sharedPlugins/inventoryImports/interfacingFunctions.spec.js +++ b/sharedPlugins/inventoryImports/interfacingFunctions.spec.js @@ -2,7 +2,7 @@ const assert = require("assert"); const child_process = require("child_process"); const functions = require("./interfacingFunctions"); const luamin = require("luamin"); -const isFactorioCommand = require("./isFactorioCommand"); +const isFactorioCommand = require("_app/isFactorioCommand"); const nock = require("nock"); // sinon does weird prototype manipulation and so doen't need to be saved to anything. diff --git a/sharedPlugins/researchSync/index.js b/sharedPlugins/researchSync/index.js index 3a0e232c..86c79732 100644 --- a/sharedPlugins/researchSync/index.js +++ b/sharedPlugins/researchSync/index.js @@ -3,18 +3,17 @@ const needle = require("needle"); class ResearchSync { - constructor(slaveConfig, messageInterface){ + constructor(slaveConfig, messageInterface, extras = {}){ this.functions = this.loadFunctions(); this.config = slaveConfig; this.messageInterface = messageInterface; this.research = {}; - messageInterface("ResearchSync enabled"); setInterval(() => { this.doSync(); this.pollResearch(); - }, 30000); + }, extras.researchSyncPollInterval || 30000); } pollResearch() { @@ -29,7 +28,7 @@ class ResearchSync { if (err) throw err; if (resp.statusCode != 200){ - console.log("got error when calling getSlaveMeta", resp.statusCode, resp.body); + this.messageInterface("got error when calling getSlaveMeta", resp.statusCode, resp.body); return; } var allmeta = JSON.parse(resp.body); @@ -92,7 +91,15 @@ class ResearchSync { } scriptOutput(data){ try { - let research = JSON.parse(data.replace("=",":").replace("[","").replace("]","")); + // remove Lua table junk + let currentResearch = data.replace("=",":").replace("[","").replace("]","").replace('"', "").replace('"', ""); + // add first " before key + currentResearch = '{"' + currentResearch.slice(1); + // add second " after the key to make it a string + currentResearch = currentResearch.split(" ")[0] + '"' + currentResearch.slice(currentResearch.split(" ")[0].length); + // turn our constructed JSON string into an object + currentResearch = JSON.parse(currentResearch); + // console.log(currentResearch) this.research = Object.assign(this.research, currentResearch); } catch (e) { } diff --git a/sharedPlugins/researchSync/index.spec.js b/sharedPlugins/researchSync/index.spec.js index be753362..59027d36 100644 --- a/sharedPlugins/researchSync/index.spec.js +++ b/sharedPlugins/researchSync/index.spec.js @@ -1,5 +1,7 @@ const assert = require("assert"); +const isFactorioCommand = require("_app/isFactorioCommand"); + const researchSync = require("./index.js"); describe("researchSync/index.js", ()=>{ @@ -8,7 +10,7 @@ describe("researchSync/index.js", ()=>{ }); describe("class researchSync()", ()=>{ it(".diff(object1, object2) returns key:value pairs that exist in object2 but not object1", ()=>{ - let reSync = new researchSync(); + let reSync = new researchSync({}, function(){}); let obj1 = { a:"str", @@ -30,5 +32,59 @@ describe("researchSync/index.js", ()=>{ assert(diffResult.d === undefined); assert(diffResult.e === "truthy"); }); + it(".pollResearch() dumps a long Lua command", ()=>{ + let reSync = new researchSync({}, io); + let ioRecieved; + function io(str){ + ioRecieved = true; + assert(isFactorioCommand(str), "pollResearch should run a command"); + } + + assert(!ioRecieved); + + reSync.pollResearch(); + + assert(ioRecieved); + }); + describe(".scriptOutput(data) handles file writes from factorio", ()=>{ + it("wants a Lua table of a single research, parses and saves it", ()=>{ + let reSync = new researchSync({hi:"hello"}, console.log); + let researches = [ + '{automation = false}', + '{["automation-2"] = false}', + '{["automation-3"] = false}', + '{electronics = false}', + '{["advanced-electronics"] = false}', + '{["advanced-electronics-2"] = false}', + '{["circuit-network"] = false}', + '{explosives = false}', + '{logistics = false}', + '{["logistics-2"] = false}', + ] + researches.forEach(research => { + reSync.scriptOutput(research); + assert(isFactorioCommand("/c x = "+research)); + }); + assert(Object.keys(reSync.research).length == researches.length); + }); + }); + it("regularily polls and syncs research (configurable delay)", (done)=>{ + let reSync = new researchSync({}, io, { + researchSyncPollInterval: 100, + }); + let ioRecieved; + function io(str){ + ioRecieved = true; + assert(isFactorioCommand(str), "pollResearch should run a command"); + } + function waitForIo(){ + if(!ioRecieved){ + setTimeout(waitForIo,50); + } else { + done(); + } + } + waitForIo(); + }); }); });