unettest Configuration¶
You can configure unettest to mimic any network. You can configure it with a
simple and straight-forward declarative configuration language, similar to
writing docker-compose.
You first define the services in the network, then you write a series of tests that are sent like requests into your network where their behavior is monitored and tested for success.
Service Definitions¶
NXR is a group of fake services that represent a real network. If you have
multiple real-world servers or serverless microservices running and an NGINX
server is handling inbound traffic rules and routing instructions, you can
define tests for that NGINX server. NXR will create a test double for each of
your microservices–they are defined in NXR as a service. Your NGINX.conf
can talk to each of them as if they were the real thing, but for ease of use,
NXR fakes them on your own computer–you don’t even need to be connected to the
internet to test your network rules!
When you load an NGINX.conf into NXR, it’ll use the routing rules as you have defined them for your production systems. Since there is a replica (as defined by your NXR Service Definitions) of the real network on your local machine, you can manipulate and test routing rules without leaving your own local development environment.
Test Doubles¶
And so, your first objective is to replicate whatever internet endpoints are referenced or used by your NGINX.conf.
Say you have a web service, bookstore. It has an assortment of routes. One
of them might be
GET /books/non-fiction?author=davis
You also have an NGINX server. This server is maybe doing things like proxy_passing requests from
nonfictionbooks.com/authors/davis
to your bookstore endpoint.
In the real world, your bookstore service receives
GET /books/non-fiction?author=davis
and might return back a list of books
Women, Race & Class, Angela Davis
Essays One, Lydia Davis
The Autobiography of, Miles Davis
NXR doesn’t care about that. NXR is simply interested in testing the routes.
You can assume that your bookstore service is working and that if you did
actually call it, it would return that. So we can define a service that
looks like bookstore from the perspective of NGINX.
services:
- bookstore:
routes:
- name: non_fiction
route: '/books/non-fiction'
method: 'GET'
status: 200
params:
- author
This tells NXR that you have a service, bookstore that can accept routes to
/books/non-fiction and will normally return a 200. It accepts params for
author. Pretty straightforward!
And so we know we have some fancy logic in our NGINX.conf that will pass a
request from elsewhere to our venerable bookstore service. Let’s make sure
that logic works.
Test Definitions¶
tests:
- test_non_fiction
send: 'GET'
target: '/authors/davis'
expect:
bookstore.non_fiction:
called_times: 1
method: 'GET'
return_status: 200
called_with:
params:
author: davis
This is defining a request sent to NGINX.conf and then checking against its intenal records that what you expect to happen is actually happening.
target is the uri sent to NGINX.
expect is a declarative way of checking what happened. This one is saying
that the route non_fiction declared in bookstore is called one time,
that it was called with a GET, that it returned a 200, and also that it
included the query param ?author=davis. Our NGINX.conf is doing this work
and here we are testing that it parsed ‘davis’ out of the uri and is properly
configured to pass it to bookstore as a query param.