npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

marimo

v1.6.1

Published

run your tests on the web

Downloads

13

Readme

Marimo

// start marimo
var Marimo = require('marimo');
var marimo = new Marimo();
marimo.listen(10001); 

// add some tests
marimo.addFile('./resources/myLocalTest.js');
marimo.addFile('http://myserver/myRemoteTest.js');

New in 1.6

New features in 1.6 including:

  • Moved to production build of Newman (Postman runtime for Node.js)
  • Tests can now be added from URL's (e.g. marimo.addFile('http://myserver/myRemoteMochaTest.js'))
  • Normalized api behavior for Postman and Mocha tests (use of environment variables, adding tests)
  • Further stability improvements, bug fixes, etc

Features

Marimo hosts your tests and lets you run them remotely over the web and also run them constantly for E2E system monitoring. Initial support is for both Mocha (http://mochajs.org/) and Postman (http://www.getpostman.com) with more coming soon. Tests are accessed over a WebSocket and can be displayed real time in a website, app or any other framework. Features include:

  • Standard WebSockets support, accessible via a browser, another node app or any other WebSocket client
  • Tests can be run perpetually and their output pushed to an alerting / monitoring service for system monitoring scenarios
  • Optional token based authentication (handshake over HTTP(S) and initialize over WebSocket)
  • Encryption via TLS / HTTPS
  • Support for Mocha and Postman (beta) - other test frameworks coming soon
  • Extensible / customizable output via your own reporters
  • Tests can be loaded from local filesystem or remote URL's
  • Support for environment variables (either process.env or resource files)

Once connected to a running marimo server, it's as easy as sending a message over a WebSocket to initiate the test:

ws.send(JSON.stringify({
  test: 'simple'
}));

And results will be streamed

✓ Test passed! [1 / 1]: "a simple test" (duration 2 ms)

Docs

Quick Start

Server

1 . Create a new folder, run "npm init" to create a sample package.json and then install required modules:

$ npm --save install marimo should mocha

2 . Create a server.js file based on this example, copied below:

var Marimo = require('marimo');
var marimo = new Marimo();
marimo.listen(10001); 

3 . Create a sub directory, called "resources" and create a mocha test within it. An example can be found here, and below:

var should = require('should');

describe('my amazing test suite', () => {
  it('a simple test', (done) => {
	var a = 2;
	var b = 2;
	a.should.be.equal(b);            
	done();
  });
});

4 . That's it! You can now run the server:

node server.js

Client

Connect to marimo and run the above test you just created. The simplest way to get started is to use a simple a simple WebSocket client like wscat. To connect enter the following command and marimo will respond with the available tests:

$ wscat -c ws://localhost:10001

< {"availableTests":{"simple":{"file":"resources/simple","type":"mocha","description":"my amazing test suite"}}}

Run the test by sending a simple JSON command:

> {"test":"simple"}

< Tests beginning. Count = 4
< ✓ Test passed! [1 / 4]: "a simple test" (duration 2 ms)
< ✓ Test passed! [2 / 4]: "a second simple test" (duration 0 ms)
< ✓ Test passed! [3 / 4]: "a third simple test" (duration 1 ms)
< ✗ Test failed! [4 / 4]: "a test designed to fail" (error: expected 1 to be 4)
< {"count":4,"duration":3,"passed":3,"failed":1}
< Tests done. passes = 3, failures = 1

You can also create a node client (or any other language) to talk to marimo. Find an example in the file client_noauth.js found here.

See below for more info on options.

Usage

Startup

Marimo can be started with just three simple lines of code:

var Marimo = require('marimo');
var marimo = new Marimo();
marimo.listen(10001); 

Options

Startup options include:

let marimo = new Marimo({
  // optional password for an HTTP auth handshake. Will return a token which can be passed to the WebSocket (default is disabled)
  auth: 'my-random-password',

  // optional path to test files (default is './resources')		
  directory: './mypath', 

  // optional timeout in milliseconds (default is 60000)
  timeout: 2000,

  // optional starting port which will be used for the debugger when launching mocha (default is 12141)
  debugPort: 11111, 

  // optional number of ports which will determine the port range for the debugger for mocha tests (to avoid port collisions)
  debugPortRange: 100,

  // optional parameter which if set to false, will ignore environment variables passed to tests (default is true)
  env: false 
});

Loading tests

In order to run a test, it must be registered with the server. Valid files which will be recognized are:

  1. Mocha files (extension .js)
  2. Postman files and their environment resources (extension .json)

There are two ways to do register test files with marimo:

Load all files at startup

If you specify the "directory" parameter in marimo's constructor, it will automatically load all tests in that folder (and its sub folders). The default directory is './resources' which does not have to exist in your server. However, if you specify a directory manually in the constructor, it must exist.

Note that files must be uniquely named or the latest will overwrite.

var Marimo = require('marimo');
var marimo = new Marimo({'directory':'./myfolder'});
marimo.listen(10001); 

If the 'directory' option is not supplied, the server will default to './resources'.

Load files individually

You can also easily add files individually, both from the local filesystem and a remote server:

// start marimo
var Marimo = require('marimo');
var marimo = new Marimo();
marimo.listen(10001); 

// add a local file
marimo.addFile('./myfolder/myLocalTest.js');

// add a remote file
marimo.addFile('http://myserver/myRemoteTest.js');

Once you add a file, it becomes available to run from a client. In the above example, to run the last test that was added, simply refer to it by filename (without the .js extension):

$ wscat -c ws://localhost:10001
> {"test":"myRemoteTest"}

Connecting to marimo

Clients

Connect to marimo by with any WebSocket client or API. Here are some examples.

wscat:

$ wscat -c ws://localhost:10001

Node.js:

var WebSocket = require('ws');
var ws = new WebSocket(`ws://localhost:10001`);

ws.on('open', () => {
});

ws.on('message', (data, flags) => {
	console.log(data);
});

Also found here.

Browser:

<script type="text/javascript">
	// connect to your server running marimo 
	socket = new WebSocket("ws://localhost:10001");

	// open the socket connection
	socket.onopen = function (event) {				
		// raise events on incoming messages
		socket.onmessage = function (event) {
			console.log(event);
		}
	}
</script>

Also found here.

Getting available tests

Once a client WebSocket connection has been established with marimo, the server will always reply with information available about the server. This will be JSON in the format:

{
	"availableTests": {...},     // a dictionary of the previously loaded tests
	"availableEnvironments": {...},    // a dictionary available json files that were loaded (postman specific - see later) 
	"monitoringTests": {...},    // a comma separated list of tests that are running in monitoring mode (if any)
}

Example:

$ wscat -c ws://localhost:10001
< {"availableTests":{"simple":{"file":"resources/simple","type":"mocha","description":"my amazing test suite"}}}

These are the tests have have been loaded, and can now be run remotely.

Running Tests

Once a WebSocket connection has been made, send a JSON object to initiate a test. These should be in the format:

{
	"test": "...",     // name of the test you want to run 
	"reporter": "...",    // optional reporter (default is "basic")
	"env": {...}    // optional object with environment variables
}

Example with wscat:

$ wscat -c ws://localhost:10001
> {"test":"simple","reporter":"basic"}

Example in Node.js:

ws.on('open', () => {
  ws.send(JSON.stringify(
	{
	  reporter: 'basic',  // optional reporter (see more for below)
	  test: 'simple'   // name of the test you want to run 
	})
  );
});

In these examples , the parameter 'test' will be the name of your test file to run. This value must correspond to one of the tests returned back in the "availableTests" object when first connecting

Running multiple tests

A comma separated list of tests will result in each test being run sequentially. This can be done as follows:

wscat:

$ wscat -c ws://localhost:10001
> {"test":"simpleTest1,simpleTest2","reporter":"basic"}

Node.js:

ws.on('open', () => {
  ws.send(JSON.stringify(
	{
	  reporter: 'basic',
	  test: 'simpleTest1,simpleTest2'
	})
  );
});

Sending parameters to tests over the WebSocket

Often tests will require access to environment variables.

These can be sent over the WebSocket and passed to the test at runtime by sending them in an object called "env" (note as of marimo 1.6.x, both Mocha and Postman tests can accept environment varibales in the same way).

Here's an example:

wscat:

$ wscat -c ws://localhost:10001
> {"test":"simple","reporter":"basic","env":{"appId":"1234","appName":"marimo"}}

Node.js:

ws.send(JSON.stringify(
  {
	reporter: 'basic',
	test: 'simple'
	env: {
	  'appId': '1234', 
	  'appName': 'marimo'
	}
  })
);

In order to access these parameters within your test, use either process.env (Mocha) or {{envName}} notation (Postman). The environment variables can now be accessed exactly as passed. For example to access the above environment variables, your tests just need to include:

Node.js:

let appId = process.env['appId'];
let appName = process.env['appName'];

Postman:

{{appName}}
{{appId}}

Loading parameters from a resource file

As an alternative to sending parameters over the WebSocket, parameters can be defined at coding time in a resource file and made availabel to your tests. To specify the right resources, set the "env" parameter to the name of the resource file.

As an example, consider the following Postman env file called dev.json, which you wish to be made available to your tests:

dev.json
{
	"id": "someguid",
	"name": "dev",
	"values": [{
			"key": "appId",
			"value": "1234",
			"type": "text",
			"enabled": true
		}]
}

To load this file and make it available to marimo, you need only include the following line in your server code:

marimo.addFile('dev.json'); // if you have the file available locally
marimo.addFile('http://myserver/dev.json'); // if the file is on a remote server

Then upon connection to marimo via a WebSocket client, you will see "dev" listed in the availableEnvironments value.

{
	"availableTests": {
		"simple":{
			"file":"resources/simple",
			"type":"postman",
			"description":"my amazing test suite"
			}
	},
	"availableEnvironments": 
	{
		"dev": {
			"file":"dev.json",
			"name":"dev"
		}
	}
}

This means you can now reference this previously loaded environment file whenever you start a test:

wscat:

$ wscat -c ws://localhost:10001
> {"test":"simple","reporter":"basic","env":"dev"}

Node.js:

ws.send(JSON.stringify(
  {
	reporter: 'basic',
	test: 'simple'
	env: "dev"
  })
);

Then within your tests, the value "appId" can be referenced by either process.env['appId'] (Node.js) or {{appId}} (Postman).

Disabling the use of parameters on the server side

Note that this feature can be disabled entirely be passing a variable to the marimo constructor:

let marimo = new Marimo({
  // optional parameter which if set to false, will ignore environment variables passed to tests (default is true)
  env: false 
});

Using Marimo for Monitoring

A powerful feature of Marimo is the ability to run tests perpetually for monitoring / alerting scenarios. To run a test in this mode, simply send the following JSON:

wscat:

$ wscat -c ws://localhost:10001?monitor=true
> {"test":"simple","reporter":"basic","monitor":{"cmd":"start","delay":1000}}

Node.js:

ws.on('open', () => {
  ws.send(JSON.stringify(
	{
	  reporter: 'basic',
	  test: 'simple'
	  monitor: {
		cmd: 'start', 
		delay: 1000 // in ms
	  }
	})
  );
});

Once a monitor style test has been started, marimo will send test results to all connected WebSocket clients that have requested to receive these updates.

To request these updates, a client must connect with URL query parameter "monitor" set to "true". As follows:

$ wscat -c http://localhost:10001?monitor=true

To monitor multiple tests, either send a comma separated list of tests (e.g. test: 'simple,complex') or send multiple requests separately (this would be preferable if you want a different delay between each test). As of > 1.4.0, Marimo now supports process isolation of each test so these tests are run in parallel. Note that once a test has been started, it can also be stopped using the following command:

wscat:

$ wscat -c ws://localhost:10001?monitor=true
> {"test":"simple","monitor":{"cmd":"stop"}}

Node.js:

ws.on('open', () => {
  ws.send(JSON.stringify(
	{
	  test: 'simple',
	  monitor: {
		cmd: 'stop'
	  }
	})
  );
});

An example client which implementing this feature can be seen in browser_monitor.html.

Authorization

If a password is supplied in the constructor (previous step), authorization will be enabled on the marimo server. This requires an authorization handshake to take place over HTTP before the WebSocket can be established. For example:

var Marimo = require('marimo');
var marimo = new Marimo({'auth':'mypassword'});
marimo.listen(10001); 

This now starts marimo with auth enabled. To authorize, first send an HTTP request:

$ curl -H 'authorization: basic mypassword' http://localhost:10001/auth

Successful responses will return with an HTTP 200 and the body equal to a token, which will be good for the life of the marimo server. E.g.

ZVg1VmpHRXpIMlVCRjV3dy9KeHB0U3gvWFA4ZFkybFc3d1k1WHVTOSs2aDlTa0sxUkUraDhYaXJKQTVuNmtpSHZ0MUp1N1c5ZUpNVUkzNmEvK3FMTkE9PQL

This token can then be passed in the web socket request:

$ wscat -c ws://localhost:10001/?token=ZVg1VmpHRXpIMlVCRjV3dy9KeHB0U3gvWFA4ZFkybFc3d1k1WHVTOSs2aDlTa0sxUkUraDhYaXJKQTVuNmtpSHZ0MUp1N1c5ZUpNVUkzNmEvK3FMTkE9PQL

< {"availableTests":{"simple":{"file":"resources/simple","type":"mocha","description":"my amazing test suite"}}}

The following shows how to connect to marimo when auth is enabled (sample is also available here):

Reporters

Marimo uses a similar reporting model to Mocha. The default reporter is 'basic'. Custom reporters can be created by contributing to the marimo git repo.

Included reporters will be added regularly. Currently supported reporters include:

  • basic
  • json-stream
  • json-stream-detail (new)
  • landing (new)

Extensibility hooks for reporters will be added soon.

Logs

To see logs, start marimo with the following environment variable (macos):

export DEBUG=marimo

Now logs will be printed to stdout, e.g.:

Sun, 21 Aug 2016 16:29:21 GMT marimo initialize: loading test file=https://raw.githubusercontent.com/lawrips/marimo/master/test/samples/mocha/simple.js
Sun, 21 Aug 2016 16:29:21 GMT marimo Listening on 10001
Sun, 21 Aug 2016 16:29:21 GMT marimo initialize: mocha test .marimo//simple.js loaded
Sun, 21 Aug 2016 16:29:21 GMT marimo initialize: loaded test descriptions