ForgeTotal.js 5
fr

Total.js 5

Tester un composant Flow seul avec Flow.test()

Total.js 5 · total5@0.0.19 flowflowstreamcomponentstests Exécutée avec Total.js 5

Flow.test(name, source, [config], [init]) construit un flux avec un composant (le source est son code, comme dans la recette de FlowStream, et config remplace sa configuration) et un composant factice qui recueille ses sorties. init(test) est appelé quand le flux est prêt, avec l'objet test :

  • test.send(inputid, data) (aussi test.input) envoie un message à une entrée du composant et le renvoie.
  • test.message = function($, data) : appelé avec chaque message que le composant envoie à n'importe laquelle de ses sorties ; $ est le message et data ses données.
  • test.reconfigure(config) change la configuration ; test.configure = function(config) est appelé après. test.variables(object) définit les variables du flux.
  • test.assert(ok, message), test.ok(message) et test.fail(message) impriment [OK] ou [NO] avec la date, et un échec lève une exception. Les fonctions sont de simples propriétés : remplacez test.ok et test.fail pour envoyer le résultat ailleurs, comme le fait l'exemple.
  • Le flux de test a toujours l'id test : un seul Flow.test() à la fois.

Il est conçu pour les tests d'un composant écrit pour un Flow, exécutés avec node index.js dans une petite application à part.

definitions/component-test.js
MAIN.results = [];

const source = `<script total>
exports.id = 'tax';
exports.name = 'Tax';
exports.inputs = [{ id: 'input', name: 'Input' }];
exports.outputs = [{ id: 'output', name: 'Output' }];
exports.config = { rate: 21 };
exports.make = function(instance, config) {
	instance.message = function($) {
		$.send('output', { net: $.data, total: Math.round($.data * (100 + config.rate)) / 100 });
	};
};
</script>`;

ON('ready', function() {
	Flow.test('tax', source, { rate: 10 }, function(test) {

		test.ok = message => MAIN.results.push('ok: ' + message);
		test.fail = message => MAIN.results.push('no: ' + message);

		test.message = function($, data) {
			test.assert(data.net === 100, 'the net amount comes back');
			test.assert(data.total === 110, 'the configuration of the test (10 %) is used, got ' + data.total);
			MAIN.results.push('message: ' + JSON.stringify(data));
		};

		test.send('input', 100);
	});
});
controllers/results.js
exports.install = function() {
	ROUTE('GET /results/', results);
};

function results($) {
	$.json(MAIN.results);
}