diff --git a/.travis.yml b/.travis.yml
index 1ea959b..f95e9db 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,7 @@
-sudo: false
+sudo: required
+
+services:
+ - docker
language: node_js
diff --git a/Makefile b/Makefile
index 81bceb0..acfad20 100644
--- a/Makefile
+++ b/Makefile
@@ -84,6 +84,7 @@ cp_js: clean_obj
####################################
test: ## Run all unit tests and lints.
$(NPM_BIN)/cross-env NODE_ENV=development make run_test -j 16 -C ./
+ make -C docker test
run_test: build lint build_test
$(NPM_BIN)/cross-env TEST_TARGET=$(TEST_TARGET) $(NODE_BIN) ./tools/test_launcher.js
diff --git a/docker/Makefile b/docker/Makefile
index a686414..866add4 100644
--- a/docker/Makefile
+++ b/docker/Makefile
@@ -8,3 +8,7 @@ devcontainer: ./DEV.Dockerfile ## Create the Docker container for development in
run_devcontainer: devcontainer ## Start up the docker container build by `make devcontainer`.
docker run -p $(DEV_CONTAINER_HOST_PORT):80 -v $(PROJECT_ROOT)/__dist:/usr/share/nginx/html:ro $(DEV_CONTAINER_NAME)
+
+test:
+ docker-compose up --build --abort-on-container-exit
+ ! docker-compose ps | grep 'Exit 1'
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
new file mode 100644
index 0000000..781af7b
--- /dev/null
+++ b/docker/docker-compose.yml
@@ -0,0 +1,17 @@
+version: "2"
+services:
+ web:
+ build:
+ context: ./
+ dockerfile: ./DEV.Dockerfile
+ ports:
+ - 80
+ volumes:
+ - ../__dist:/usr/share/nginx/html:ro
+ test:
+ image: quay.io/spesnova/infrataster
+ volumes:
+ - ./spec:/test/spec
+ depends_on:
+ - web
+ network_mode: "service:web"
diff --git a/docker/spec/css_spec.rb b/docker/spec/css_spec.rb
new file mode 100644
index 0000000..82cf90b
--- /dev/null
+++ b/docker/spec/css_spec.rb
@@ -0,0 +1,15 @@
+require 'spec_helper'
+
+describe server(:web) do
+ describe http('http://web/css/bundle.css') do
+ it "returns 200" do
+ expect(response.status).to eq(200)
+ end
+ it "returns test/css" do
+ expect(response.headers['Content-Type']).to eq("text/css")
+ end
+ it "responds content contains charset declaration" do
+ expect(response.body).to include("@charset 'utf-8';")
+ end
+ end
+end
diff --git a/docker/spec/operator_spec.rb b/docker/spec/operator_spec.rb
new file mode 100644
index 0000000..15d0c90
--- /dev/null
+++ b/docker/spec/operator_spec.rb
@@ -0,0 +1,27 @@
+require 'spec_helper'
+
+describe server(:web) do
+ describe http('http://web/operator/') do
+ it "returns 200" do
+ expect(response.status).to eq(200)
+ end
+ it "returns test/html" do
+ expect(response.headers['Content-Type']).to eq("text/html")
+ end
+ it "responds content loads operator.js" do
+ expect(response.body).to include('')
+ end
+ end
+
+ describe http('http://web/js/operator.js') do
+ it "returns 200" do
+ expect(response.status).to eq(200)
+ end
+ it "returns test/css" do
+ expect(response.headers['Content-Type']).to eq("application/javascript")
+ end
+ it "responds content contains 'use strict'" do
+ expect(response.body).to include("'use strict';")
+ end
+ end
+end
diff --git a/docker/spec/public_spec.rb b/docker/spec/public_spec.rb
new file mode 100644
index 0000000..1e6b0e6
--- /dev/null
+++ b/docker/spec/public_spec.rb
@@ -0,0 +1,27 @@
+require 'spec_helper'
+
+describe server(:web) do
+ describe http('http://web/') do
+ it "returns 200" do
+ expect(response.status).to eq(200)
+ end
+ it "returns test/html" do
+ expect(response.headers['Content-Type']).to eq("text/html")
+ end
+ it "responds content loads public.js" do
+ expect(response.body).to include('')
+ end
+ end
+
+ describe http('http://web/js/public.js') do
+ it "returns 200" do
+ expect(response.status).to eq(200)
+ end
+ it "returns test/css" do
+ expect(response.headers['Content-Type']).to eq("application/javascript")
+ end
+ it "responds content contains 'use strict'" do
+ expect(response.body).to include("'use strict';")
+ end
+ end
+end
diff --git a/docker/spec/spec_helper.rb b/docker/spec/spec_helper.rb
new file mode 100644
index 0000000..f71c4d5
--- /dev/null
+++ b/docker/spec/spec_helper.rb
@@ -0,0 +1,5 @@
+require 'infrataster/rspec'
+
+Infrataster::Server.define(:web) do |server|
+ server.address = '127.0.0.1'
+end
diff --git a/docker/spec/sponsor_spec.rb b/docker/spec/sponsor_spec.rb
new file mode 100644
index 0000000..6998659
--- /dev/null
+++ b/docker/spec/sponsor_spec.rb
@@ -0,0 +1,27 @@
+require 'spec_helper'
+
+describe server(:web) do
+ describe http('http://web/sponsor/') do
+ it "returns 200" do
+ expect(response.status).to eq(200)
+ end
+ it "returns test/html" do
+ expect(response.headers['Content-Type']).to eq("text/html")
+ end
+ it "responds content loads operator.js" do
+ expect(response.body).to include('')
+ end
+ end
+
+ describe http('http://web/js/sponsor.js') do
+ it "returns 200" do
+ expect(response.status).to eq(200)
+ end
+ it "returns test/css" do
+ expect(response.headers['Content-Type']).to eq("application/javascript")
+ end
+ it "responds content contains 'use strict'" do
+ expect(response.body).to include("'use strict';")
+ end
+ end
+end