"use strict"; const assert = require("assert").strict; const mock = require("../../../test/mock"); const instance = require("../instance"); const info = require("../info"); describe("statistics_exporter plugin", function() { describe("class InstancePlugin", function() { let instancePlugin; before(async function() { instancePlugin = new instance.InstancePlugin(info, new mock.MockInstance()); await instancePlugin.init(); }); describe(".onMetrics()", function() { it("should record statistics", async function() { instancePlugin.instance.server.rconCommandResults.set( "/sc statistics_exporter.export()", JSON.stringify({ game_tick: 100, player_count: 3, force_flow_statistics: { player: { item_production_statistics: { input: { "inserter": 10 }, output: { "iron-plate": 24 }, }, }, }, game_flow_statistics: { pollution_statistics: { input: { "boiler": 2000 }, output: { "tree-proxy": 560 }, }, }, }) ); await instancePlugin.onMetrics(); assert.equal(instance._instancePlayerCount.labels("7357").get(), 3); assert.equal(instance._instanceGameTicksTotal.labels("7357").get(), 100); assert.equal(instance._instanceForceFlowStatistics.labels( "7357", "player", "item_production_statistics", "input", "inserter").get(), 10); assert.equal(instance._instanceGameFlowStatistics.labels( "7357", "pollution_statistics", "input", "boiler").get(), 2000); }); it("should pass on JSON parse errors", async function() { let string = "An error occured\n"; instancePlugin.instance.server.rconCommandResults.set( "/sc statistics_exporter.export()", string ); let errorMessage; try { JSON.parse(string); } catch (err) { errorMessage = err.message; } await assert.rejects( instancePlugin.onMetrics(), new Error(`Error parsing statistics JSON: ${errorMessage}, content "${string}"`) ); }); }); }); });