diff --git a/.gitignore b/.gitignore index 43c1931fd..e391408ef 100644 --- a/.gitignore +++ b/.gitignore @@ -13,9 +13,6 @@ src/.baseDir.ts *.swp -/config.yml - -npm-debug.log # Directory used by example notifications/ @@ -29,3 +26,7 @@ dist/ .nyc_output/ *.tgz + +# Specific files +/config.yml +/test/integration/nginx.conf diff --git a/Gruntfile.js b/Gruntfile.js index 0c9777516..695b59442 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -14,12 +14,16 @@ module.exports = function (grunt) { }, "test": { cmd: "./node_modules/.bin/mocha", - args: ['--compilers', 'ts:ts-node/register', '--recursive', 'test/client', 'test/server'] + args: ['--compilers', 'ts:ts-node/register', '--recursive', 'test/unit'] }, "test-int": { cmd: "./node_modules/.bin/mocha", args: ['--compilers', 'ts:ts-node/register', '--recursive', 'test/integration'] }, + "test-system": { + cmd: "./node_modules/.bin/mocha", + args: ['--compilers', 'ts:ts-node/register', '--recursive', 'test/system'] + }, "docker-build": { cmd: "docker", args: ['build', '-t', 'clems4ever/authelia', '.'] @@ -154,8 +158,9 @@ module.exports = function (grunt) { grunt.registerTask('build-resources', ['copy:resources', 'copy:views', 'copy:images', 'copy:thirdparties', 'concat:css']); - grunt.registerTask('build-dev', ['run:tslint', 'run:build', 'browserify:dist', 'build-resources', 'run:make-dev-views']); - grunt.registerTask('build-dist', ['build-dev', 'run:minify', 'cssmin']); + grunt.registerTask('build-common', ['run:tslint', 'run:build', 'browserify:dist', 'build-resources']); + grunt.registerTask('build-dev', ['build-common', 'run:make-dev-views']); + grunt.registerTask('build-dist', ['build-common', 'run:minify', 'cssmin']); grunt.registerTask('docker-build', ['run:docker-build']); grunt.registerTask('docker-restart', ['run:docker-restart']); diff --git a/README.md b/README.md index 14108ddfb..26cf1ab2c 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ Deploy **Authelia** example with the following command: npm install --only=dev ./node_modules/.bin/grunt build-dist - ./scripts/deploy-example.sh + ./scripts/example/deploy-example.sh After few seconds the services should be running and you should be able to visit [https://home.test.local:8080/](https://home.test.local:8080/). diff --git a/config.template.yml b/config.template.yml index c44ac6881..e93838164 100644 --- a/config.template.yml +++ b/config.template.yml @@ -12,7 +12,7 @@ logs_level: info # Example: for user john, the DN will be cn=john,ou=users,dc=example,dc=com ldap: # The url of the ldap server - url: ldap://openldap-restriction + url: ldap://openldap # The base dn for every entries base_dn: dc=example,dc=com diff --git a/docker-compose.base.yml b/docker-compose.base.yml index 3432395ad..7c610d62a 100644 --- a/docker-compose.base.yml +++ b/docker-compose.base.yml @@ -1,5 +1,4 @@ version: '2' - networks: example-network: driver: bridge diff --git a/example/nginx/docker-compose.yml b/example/nginx/docker-compose.yml index f41273779..8857ee3bd 100644 --- a/example/nginx/docker-compose.yml +++ b/example/nginx/docker-compose.yml @@ -12,13 +12,13 @@ services: depends_on: - authelia networks: - example-network: - aliases: - - home.test.local - - secret.test.local - - secret1.test.local - - secret2.test.local - - mx1.mail.test.local - - mx2.mail.test.local - - auth.test.local + - example-network + # aliases: + # - home.test.local + # - secret.test.local + # - secret1.test.local + # - secret2.test.local + # - mx1.mail.test.local + # - mx2.mail.test.local + # - auth.test.local diff --git a/example/nginx/nginx.conf b/example/nginx/nginx.conf index bb0749f34..53e4e3b8f 100644 --- a/example/nginx/nginx.conf +++ b/example/nginx/nginx.conf @@ -40,9 +40,11 @@ http { proxy_intercept_errors on; - error_page 401 = /error/401; - error_page 403 = /error/403; - error_page 404 = /error/404; + if ($request_method !~ ^(POST)$){ + error_page 401 = /error/401; + error_page 403 = /error/403; + error_page 404 = /error/404; + } } } diff --git a/scripts/dc-test.sh b/scripts/dc-test.sh deleted file mode 100755 index 533f363cb..000000000 --- a/scripts/dc-test.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -set -e - -docker-compose -f docker-compose.base.yml -f example/redis/docker-compose.yml -f example/ldap/docker-compose.yml -f test/integration/docker-compose.yml $* diff --git a/scripts/deploy-example.sh b/scripts/deploy-example.sh deleted file mode 100755 index 006747a45..000000000 --- a/scripts/deploy-example.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -./scripts/dc-example.sh build -./scripts/dc-example.sh up -d diff --git a/scripts/check-services.sh b/scripts/example/check-services.sh similarity index 84% rename from scripts/check-services.sh rename to scripts/example/check-services.sh index a1085e560..49a760698 100755 --- a/scripts/check-services.sh +++ b/scripts/example/check-services.sh @@ -2,7 +2,7 @@ service_count=`docker ps -a | grep "Up " | wc -l` -if [ "${service_count}" -eq "4" ] +if [ "${service_count}" -eq "5" ] then echo "Service are up and running." exit 0 diff --git a/scripts/dc-example.sh b/scripts/example/dc-example.sh similarity index 63% rename from scripts/dc-example.sh rename to scripts/example/dc-example.sh index 4b04a22ec..82c77f066 100755 --- a/scripts/dc-example.sh +++ b/scripts/example/dc-example.sh @@ -2,4 +2,4 @@ set -e -docker-compose -f docker-compose.base.yml -f docker-compose.yml -f example/redis/docker-compose.yml -f example/nginx/docker-compose.yml -f example/ldap/docker-compose.yml $* +docker-compose -f docker-compose.base.yml -f docker-compose.yml -f example/redis/docker-compose.yml -f example/nginx/docker-compose.yml -f example/ldap/docker-compose.yml -f test/integration/docker-compose.yml $* diff --git a/scripts/example/deploy-example.sh b/scripts/example/deploy-example.sh new file mode 100755 index 000000000..e804face0 --- /dev/null +++ b/scripts/example/deploy-example.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +DC_SCRIPT=./scripts/example/dc-example.sh + +$DC_SCRIPT build +$DC_SCRIPT up -d diff --git a/scripts/example/undeploy-example.sh b/scripts/example/undeploy-example.sh new file mode 100755 index 000000000..0c3a6f7bd --- /dev/null +++ b/scripts/example/undeploy-example.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +DC_SCRIPT=./scripts/example/dc-example.sh + +$DC_SCRIPT down diff --git a/scripts/integration-tests.sh b/scripts/integration-tests.sh new file mode 100755 index 000000000..681f58580 --- /dev/null +++ b/scripts/integration-tests.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +DC_SCRIPT=./scripts/example/dc-example.sh + +run_services() { + $DC_SCRIPT up -d redis openldap + sleep 2 + $DC_SCRIPT up -d authelia nginx nginx-tests + sleep 3 +} + +set -e + +echo "Make sure services are not already running" +$DC_SCRIPT down + + +# Prepare & run integration tests + +echo "Prepare nginx-test configuration" +cat example/nginx/nginx.conf | sed 's/listen 443 ssl/listen 8080 ssl/g' | dd of="test/integration/nginx.conf" + +echo "Build services images..." +$DC_SCRIPT build + +echo "Start services..." +run_services +docker ps -a + +echo "Display services logs..." +$DC_SCRIPT logs redis +$DC_SCRIPT logs openldap +$DC_SCRIPT logs nginx +$DC_SCRIPT logs nginx-tests +$DC_SCRIPT logs authelia + +echo "Check number of services" +./scripts/example/check-services.sh + +echo "Run integration tests..." +$DC_SCRIPT run --rm integration-tests + +echo "Shutdown services..." +$DC_SCRIPT down + +# Prepare & test example from end user perspective + +echo "Start services..." +run_services + +./node_modules/.bin/mocha --compilers ts:ts-node/register --recursive test/system + +$DC_SCRIPT down + diff --git a/scripts/run-int-test.sh b/scripts/run-int-test.sh deleted file mode 100755 index cf3df97ab..000000000 --- a/scripts/run-int-test.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -set -e - -echo "Build services images..." -./scripts/dc-test.sh build - -echo "Start services..." -./scripts/dc-test.sh up -d redis openldap -sleep 2 -./scripts/dc-test.sh up -d authelia nginx -sleep 3 -docker ps -a - -echo "Display services logs..." -./scripts/dc-test.sh logs authelia -./scripts/dc-test.sh logs nginx -./scripts/dc-test.sh logs openldap - -echo "Run integration tests..." -./scripts/dc-test.sh run --rm --name int-test int-test - -echo "Shutdown services..." -./scripts/dc-test.sh down diff --git a/scripts/run-staging.sh b/scripts/run-staging.sh deleted file mode 100755 index 7b03e236b..000000000 --- a/scripts/run-staging.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -set -e - -# Build production environment and set it up -./scripts/dc-example.sh build -./scripts/dc-example.sh up -d - -# Wait for services to be running -sleep 5 - -# Check if services are correctly running -./scripts/check-services.sh - -./scripts/dc-example.sh down diff --git a/scripts/travis.sh b/scripts/travis.sh index ef0d7e155..7fcb42f3b 100755 --- a/scripts/travis.sh +++ b/scripts/travis.sh @@ -11,11 +11,8 @@ grunt test # Build the app from Typescript and package grunt build-dist -# Run integration tests -./scripts/run-int-test.sh - -# Test staging environment -./scripts/run-staging.sh +# Run integration/example tests +./scripts/integration-tests.sh # Test npm deployment before actual deployment ./scripts/npm-deployment-test.sh diff --git a/scripts/undeploy-example.sh b/scripts/undeploy-example.sh deleted file mode 100755 index 5040b84f7..000000000 --- a/scripts/undeploy-example.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -./scripts/dc-example.sh down diff --git a/test/integration/Server.test.ts b/test/integration/Server.test.ts deleted file mode 100644 index dd1aa6d61..000000000 --- a/test/integration/Server.test.ts +++ /dev/null @@ -1,164 +0,0 @@ - -import Request = require("request"); -import Assert = require("assert"); -import Speakeasy = require("speakeasy"); -import BluebirdPromise = require("bluebird"); -import Util = require("util"); -import Sinon = require("sinon"); -import Endpoints = require("../../src/server/endpoints"); - -const EXEC_PATH = "./dist/src/server/index.js"; -const CONFIG_PATH = "./test/integration/config.yml"; -const j = Request.jar(); -const request: typeof Request = BluebirdPromise.promisifyAll(Request.defaults({ jar: j })); - -process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; - -const DOMAIN = "test.local"; -const PORT = 8080; - -const HOME_URL = Util.format("https://%s.%s:%d", "home", DOMAIN, PORT); -const SECRET_URL = Util.format("https://%s.%s:%d", "secret", DOMAIN, PORT); -const SECRET1_URL = Util.format("https://%s.%s:%d", "secret1", DOMAIN, PORT); -const SECRET2_URL = Util.format("https://%s.%s:%d", "secret2", DOMAIN, PORT); -const MX1_URL = Util.format("https://%s.%s:%d", "mx1.mail", DOMAIN, PORT); -const MX2_URL = Util.format("https://%s.%s:%d", "mx2.mail", DOMAIN, PORT); -const BASE_AUTH_URL = Util.format("https://%s.%s:%d", "auth", DOMAIN, PORT); - -function waitFor(ms: number): BluebirdPromise<{}> { - return new BluebirdPromise(function (resolve, reject) { - setTimeout(function () { - resolve(); - }, ms); - }); -} - -describe("test the server", function () { - let home_page: string; - let login_page: string; - - before(function () { - const home_page_promise = getHomePage() - .then(function (data) { - home_page = data.body; - }); - const login_page_promise = getLoginPage() - .then(function (data) { - login_page = data.body; - }); - - return BluebirdPromise.all([home_page_promise, - login_page_promise]); - }); - - after(function () { - }); - - function str_contains(str: string, pattern: string) { - return str.indexOf(pattern) != -1; - } - - function home_page_contains(pattern: string) { - return str_contains(home_page, pattern); - } - - it("should serve a correct home page", function () { - Assert(home_page_contains(BASE_AUTH_URL + Endpoints.LOGOUT_GET + "?redirect=" + HOME_URL + "/")); - Assert(home_page_contains(HOME_URL + "/secret.html")); - Assert(home_page_contains(SECRET_URL + "/secret.html")); - Assert(home_page_contains(SECRET1_URL + "/secret.html")); - Assert(home_page_contains(SECRET2_URL + "/secret.html")); - Assert(home_page_contains(MX1_URL + "/secret.html")); - Assert(home_page_contains(MX2_URL + "/secret.html")); - }); - - it("should serve the login page", function () { - return getPromised(BASE_AUTH_URL + Endpoints.FIRST_FACTOR_GET) - .then(function (data: Request.RequestResponse) { - Assert.equal(data.statusCode, 200); - }); - }); - - it("should serve the homepage", function () { - return getPromised(HOME_URL + "/") - .then(function (data: Request.RequestResponse) { - Assert.equal(data.statusCode, 200); - }); - }); - - it("should redirect when logout", function () { - return getPromised(BASE_AUTH_URL + Endpoints.LOGOUT_GET + "?redirect=" + HOME_URL) - .then(function (data: Request.RequestResponse) { - Assert.equal(data.statusCode, 200); - Assert.equal(data.body, home_page); - }); - }); - - it("should be redirected to the login page when accessing secret while not authenticated", function () { - return getPromised(HOME_URL + "/secret.html") - .then(function (data: Request.RequestResponse) { - Assert.equal(data.statusCode, 200); - Assert.equal(data.body, login_page); - }); - }); - - it.skip("should fail the first factor", function () { - return postPromised(BASE_AUTH_URL + Endpoints.FIRST_FACTOR_POST, { - form: { - username: "admin", - password: "password", - } - }) - .then(function (data: Request.RequestResponse) { - Assert.equal(data.body, "Bad credentials"); - }); - }); - - function login_as(username: string, password: string) { - return postPromised(BASE_AUTH_URL + Endpoints.FIRST_FACTOR_POST, { - form: { - username: "john", - password: "password", - } - }) - .then(function (data: Request.RequestResponse) { - Assert.equal(data.statusCode, 302); - return BluebirdPromise.resolve(); - }); - } - - it("should succeed the first factor", function () { - return login_as("john", "password"); - }); - - describe("test ldap connection", function () { - it("should not fail after inactivity", function () { - const clock = Sinon.useFakeTimers(); - return login_as("john", "password") - .then(function () { - clock.tick(3600000 * 24); // 24 hour - return login_as("john", "password"); - }) - .then(function () { - clock.restore(); - return BluebirdPromise.resolve(); - }); - }); - }); -}); - -function getPromised(url: string) { - return request.getAsync(url); -} - -function postPromised(url: string, body: Object) { - return request.postAsync(url, body); -} - -function getHomePage(): BluebirdPromise { - return getPromised(HOME_URL + "/"); -} - -function getLoginPage(): BluebirdPromise { - return getPromised(BASE_AUTH_URL + Endpoints.FIRST_FACTOR_GET); -} diff --git a/test/integration/config.yml b/test/integration/config.yml deleted file mode 100644 index 7854350ea..000000000 --- a/test/integration/config.yml +++ /dev/null @@ -1,97 +0,0 @@ - -# The port to listen on -port: 80 - -# Log level -# -# Level of verbosity for logs -logs_level: debug - -# LDAP configuration -# -# Example: for user john, the DN will be cn=john,ou=users,dc=example,dc=com -ldap: - # The url of the ldap server - url: ldap://openldap - - # The base dn for every entries - base_dn: dc=example,dc=com - - # An additional dn to define the scope to all users - additional_user_dn: ou=users - - # The user name attribute of users. Might uid for FreeIPA. 'cn' by default. - user_name_attribute: cn - - # An additional dn to define the scope of groups - additional_group_dn: ou=groups - - # The group name attribute of group. 'cn' by default. - group_name_attribute: cn - - # The username and password of the admin user. - user: cn=admin,dc=example,dc=com - password: password - - -# Access Control -# -# Access control is a set of rules you can use to restrict the user access. -# Default (anyone), per-user or per-group rules can be defined. -# -# If 'access_control' is not defined, ACL rules are disabled and default policy -# is applied, i.e., access is allowed to anyone. Otherwise restrictions follow -# the rules defined below. -# If no rule is provided, all domains are denied. -# -# '*' means 'any' subdomains and matches any string. It must stand at the -# beginning of the pattern. -access_control: - default: - - home.test.local - groups: - admin: - - '*.test.local' - dev: - - secret.test.local - - secret2.test.local - users: - harry: - - secret1.test.local - bob: - - '*.mail.test.local' - - -# Configuration of session cookies -# -# _secret_ the secret to encrypt session cookies -# _expiration_ the time before cookies expire -# _domain_ the domain to protect. -# Note: the authenticator must also be in that domain. If empty, the cookie -# is restricted to the subdomain of the issuer. -session: - secret: unsecure_secret - expiration: 3600000 - domain: test.local - redis: - host: redis - port: 6379 - - -# The directory where the DB files will be saved -store_directory: /var/lib/authelia/store - - -# Notifications are sent to users when they require a password reset, a u2f -# registration or a TOTP registration. -# Use only one available configuration: filesystem, gmail -notifier: - # For testing purpose, notifications can be sent in a file - filesystem: - filename: /var/lib/authelia/notifications/notification.txt - - # Use your gmail account to send the notifications. You can use an app password. - # gmail: - # username: user - # password: password - diff --git a/test/integration/docker-compose.yml b/test/integration/docker-compose.yml index afaab5b1f..9303e2e9d 100644 --- a/test/integration/docker-compose.yml +++ b/test/integration/docker-compose.yml @@ -1,15 +1,6 @@ version: '2' services: - authelia: - image: node:7-alpine - command: node /usr/src/dist/src/server/index.js /etc/authelia/config.yml - volumes: - - ./:/usr/src - - ./test/integration/config.yml:/etc/authelia/config.yml:ro - networks: - - example-network - - int-test: + integration-tests: build: ./test/integration command: ./node_modules/.bin/mocha --compilers ts:ts-node/register --recursive test/integration volumes: @@ -17,8 +8,7 @@ services: networks: - example-network - - nginx: + nginx-tests: image: nginx:alpine volumes: - ./example/nginx/index.html:/usr/share/nginx/html/index.html @@ -39,4 +29,3 @@ services: - mx1.mail.test.local - mx2.mail.test.local - auth.test.local - diff --git a/test/integration/main.ts b/test/integration/main.ts new file mode 100644 index 000000000..0f6db7d5e --- /dev/null +++ b/test/integration/main.ts @@ -0,0 +1,112 @@ + +process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; + +import Request = require("request"); +import Assert = require("assert"); +import BluebirdPromise = require("bluebird"); +import Util = require("util"); +import Redis = require("redis"); +import Endpoints = require("../../src/server/endpoints"); + +const RequestAsync = BluebirdPromise.promisifyAll(Request) as typeof Request; + +const DOMAIN = "test.local"; +const PORT = 8080; + +const HOME_URL = Util.format("https://%s.%s:%d", "home", DOMAIN, PORT); +const SECRET_URL = Util.format("https://%s.%s:%d", "secret", DOMAIN, PORT); +const SECRET1_URL = Util.format("https://%s.%s:%d", "secret1", DOMAIN, PORT); +const SECRET2_URL = Util.format("https://%s.%s:%d", "secret2", DOMAIN, PORT); +const MX1_URL = Util.format("https://%s.%s:%d", "mx1.mail", DOMAIN, PORT); +const MX2_URL = Util.format("https://%s.%s:%d", "mx2.mail", DOMAIN, PORT); + +const BASE_AUTH_URL = Util.format("https://%s.%s:%d", "auth", DOMAIN, PORT); +const FIRST_FACTOR_URL = Util.format("%s/api/firstfactor", BASE_AUTH_URL); +const LOGOUT_URL = Util.format("%s/logout", BASE_AUTH_URL); + + +const redisOptions = { + host: "redis", + port: 6379 +}; + + +describe("integration tests", function () { + let redisClient: Redis.RedisClient; + + before(function () { + redisClient = Redis.createClient(redisOptions); + }); + + function str_contains(str: string, pattern: string) { + return str.indexOf(pattern) != -1; + } + + function test_homepage_is_correct(body: string) { + Assert(str_contains(body, BASE_AUTH_URL + Endpoints.LOGOUT_GET + "?redirect=" + HOME_URL + "/")); + Assert(str_contains(body, HOME_URL + "/secret.html")); + Assert(str_contains(body, SECRET_URL + "/secret.html")); + Assert(str_contains(body, SECRET1_URL + "/secret.html")); + Assert(str_contains(body, SECRET2_URL + "/secret.html")); + Assert(str_contains(body, MX1_URL + "/secret.html")); + Assert(str_contains(body, MX2_URL + "/secret.html")); + Assert(str_contains(body, "Access the secret")); + } + + it("should access the home page", function () { + return RequestAsync.getAsync(HOME_URL) + .then(function (response: Request.RequestResponse) { + Assert.equal(200, response.statusCode); + test_homepage_is_correct(response.body); + }); + }); + + it("should access the authentication page", function () { + return RequestAsync.getAsync(BASE_AUTH_URL) + .then(function (response: Request.RequestResponse) { + Assert.equal(200, response.statusCode); + Assert(response.body.indexOf("Sign in") > -1); + }); + }); + + it("should fail first factor when wrong credentials are provided", function () { + return RequestAsync.postAsync(FIRST_FACTOR_URL, { + json: true, + body: { + username: "john", + password: "wrong password" + } + }) + .then(function (response: Request.RequestResponse) { + Assert.equal(401, response.statusCode); + }); + }); + + it("should redirect when correct credentials are provided during first factor", function () { + return RequestAsync.postAsync(FIRST_FACTOR_URL, { + json: true, + body: { + username: "john", + password: "password" + } + }) + .then(function (response: Request.RequestResponse) { + Assert.equal(302, response.statusCode); + }); + }); + + it("should have registered four sessions in redis", function (done) { + redisClient.dbsize(function (err: Error, count: number) { + Assert.equal(3, count); + done(); + }); + }); + + it("should redirect to home page when logout is called", function () { + return RequestAsync.getAsync(Util.format("%s?redirect=%s", LOGOUT_URL, HOME_URL)) + .then(function (response: Request.RequestResponse) { + Assert.equal(200, response.statusCode); + Assert(response.body.indexOf("Access the secret") > -1); + }); + }); +}); \ No newline at end of file diff --git a/test/integration/nginx.conf b/test/integration/nginx.conf deleted file mode 100644 index 39f7baa01..000000000 --- a/test/integration/nginx.conf +++ /dev/null @@ -1,86 +0,0 @@ -# nginx-sso - example nginx config -# -# (c) 2015 by Johannes Gilger -# -# This is an example config for using nginx with the nginx-sso cookie system. -# For simplicity, this config sets up two fictional vhosts that you can use to -# test against both components of the nginx-sso system: ssoauth & ssologin. -# In a real deployment, these vhosts would be separate hosts. - -#user nobody; -worker_processes 1; - -#error_log logs/error.log; -#error_log logs/error.log notice; -#error_log logs/error.log info; - -#pid logs/nginx.pid; - -events { - worker_connections 1024; -} - - -http { - server { - listen 8080 ssl; - server_name auth.test.local localhost; - - ssl on; - ssl_certificate /etc/ssl/server.crt; - ssl_certificate_key /etc/ssl/server.key; - - - location / { - proxy_set_header X-Original-URI $request_uri; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - - proxy_pass http://authelia/; - - proxy_intercept_errors on; - - error_page 401 = /error/401; - error_page 403 = /error/403; - error_page 404 = /error/404; - } - } - - server { - listen 8080 ssl; - root /usr/share/nginx/html; - - server_name secret1.test.local secret2.test.local secret.test.local - home.test.local mx1.mail.test.local mx2.mail.test.local; - - ssl on; - ssl_certificate /etc/ssl/server.crt; - ssl_certificate_key /etc/ssl/server.key; - - error_page 401 = @error401; - location @error401 { - return 302 https://auth.test.local:8080; - } - - location /auth_verify { - internal; - proxy_set_header X-Original-URI $request_uri; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Host $http_host; - - proxy_pass http://authelia/verify; - } - - location = /secret.html { - auth_request /auth_verify; - - auth_request_set $user $upstream_http_x_remote_user; - proxy_set_header X-Forwarded-User $user; - auth_request_set $groups $upstream_http_remote_groups; - proxy_set_header Remote-Groups $groups; - auth_request_set $expiry $upstream_http_remote_expiry; - proxy_set_header Remote-Expiry $expiry; - } - } -} - diff --git a/test/integration/redis.test.ts b/test/integration/redis.test.ts deleted file mode 100644 index 185d9da4c..000000000 --- a/test/integration/redis.test.ts +++ /dev/null @@ -1,23 +0,0 @@ - -import Redis = require("redis"); -import Assert = require("assert"); - -const redisOptions = { - host: "redis", - port: 6379 -}; - -describe("test redis is correctly used", function () { - let redisClient: Redis.RedisClient; - - before(function () { - redisClient = Redis.createClient(redisOptions); - }); - - it("should have registered at least one session", function (done) { - redisClient.dbsize(function (err: Error, count: number) { - Assert.equal(1, count); - done(); - }); - }); -}); \ No newline at end of file diff --git a/test/system/main.ts b/test/system/main.ts new file mode 100644 index 000000000..7e7591b97 --- /dev/null +++ b/test/system/main.ts @@ -0,0 +1,92 @@ + +process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; + +import Request = require("request"); +import Assert = require("assert"); +import BluebirdPromise = require("bluebird"); +import Util = require("util"); +import Endpoints = require("../../src/server/endpoints"); + +const RequestAsync = BluebirdPromise.promisifyAll(Request) as typeof Request; + +const DOMAIN = "test.local"; +const PORT = 8080; + +const HOME_URL = Util.format("https://%s.%s:%d", "home", DOMAIN, PORT); +const SECRET_URL = Util.format("https://%s.%s:%d", "secret", DOMAIN, PORT); +const SECRET1_URL = Util.format("https://%s.%s:%d", "secret1", DOMAIN, PORT); +const SECRET2_URL = Util.format("https://%s.%s:%d", "secret2", DOMAIN, PORT); +const MX1_URL = Util.format("https://%s.%s:%d", "mx1.mail", DOMAIN, PORT); +const MX2_URL = Util.format("https://%s.%s:%d", "mx2.mail", DOMAIN, PORT); + +const BASE_AUTH_URL = Util.format("https://%s.%s:%d", "auth", DOMAIN, PORT); +const FIRST_FACTOR_URL = Util.format("%s/api/firstfactor", BASE_AUTH_URL); +const LOGOUT_URL = Util.format("%s/logout", BASE_AUTH_URL); + + +describe("test example environment", function () { + function str_contains(str: string, pattern: string) { + return str.indexOf(pattern) != -1; + } + + function test_homepage_is_correct(body: string) { + Assert(str_contains(body, BASE_AUTH_URL + Endpoints.LOGOUT_GET + "?redirect=" + HOME_URL + "/")); + Assert(str_contains(body, HOME_URL + "/secret.html")); + Assert(str_contains(body, SECRET_URL + "/secret.html")); + Assert(str_contains(body, SECRET1_URL + "/secret.html")); + Assert(str_contains(body, SECRET2_URL + "/secret.html")); + Assert(str_contains(body, MX1_URL + "/secret.html")); + Assert(str_contains(body, MX2_URL + "/secret.html")); + Assert(str_contains(body, "Access the secret")); + } + + it("should access the home page", function () { + return RequestAsync.getAsync(HOME_URL) + .then(function (response: Request.RequestResponse) { + Assert.equal(200, response.statusCode); + test_homepage_is_correct(response.body); + }); + }); + + it("should access the authentication page", function () { + return RequestAsync.getAsync(BASE_AUTH_URL) + .then(function (response: Request.RequestResponse) { + Assert.equal(200, response.statusCode); + Assert(response.body.indexOf("Sign in") > -1); + }); + }); + + it("should fail first factor when wrong credentials are provided", function () { + return RequestAsync.postAsync(FIRST_FACTOR_URL, { + json: true, + body: { + username: "john", + password: "wrong password" + } + }) + .then(function (response: Request.RequestResponse) { + Assert.equal(401, response.statusCode); + }); + }); + + it("should redirect when correct credentials are provided during first factor", function () { + return RequestAsync.postAsync(FIRST_FACTOR_URL, { + json: true, + body: { + username: "john", + password: "password" + } + }) + .then(function (response: Request.RequestResponse) { + Assert.equal(302, response.statusCode); + }); + }); + + it("should redirect to home page when logout is called", function () { + return RequestAsync.getAsync(Util.format("%s?redirect=%s", LOGOUT_URL, HOME_URL)) + .then(function (response: Request.RequestResponse) { + Assert.equal(200, response.statusCode); + Assert(response.body.indexOf("Access the secret") > -1); + }); + }); +}); \ No newline at end of file diff --git a/test/client/firstfactor/FirstFactorValidator.test.ts b/test/unit/client/firstfactor/FirstFactorValidator.test.ts similarity index 94% rename from test/client/firstfactor/FirstFactorValidator.test.ts rename to test/unit/client/firstfactor/FirstFactorValidator.test.ts index 717f10609..7ac115d00 100644 --- a/test/client/firstfactor/FirstFactorValidator.test.ts +++ b/test/unit/client/firstfactor/FirstFactorValidator.test.ts @@ -1,5 +1,5 @@ -import FirstFactorValidator = require("../../../src/client/firstfactor/FirstFactorValidator"); +import FirstFactorValidator = require("../../../../src/client/firstfactor/FirstFactorValidator"); import JQueryMock = require("../mocks/jquery"); import BluebirdPromise = require("bluebird"); import Assert = require("assert"); diff --git a/test/client/firstfactor/login.test.ts b/test/unit/client/firstfactor/login.test.ts similarity index 93% rename from test/client/firstfactor/login.test.ts rename to test/unit/client/firstfactor/login.test.ts index 50e7307f1..daf9688c7 100644 --- a/test/client/firstfactor/login.test.ts +++ b/test/unit/client/firstfactor/login.test.ts @@ -1,9 +1,9 @@ -import Endpoints = require("../../../src/server/endpoints"); +import Endpoints = require("../../../../src/server/endpoints"); import BluebirdPromise = require("bluebird"); -import UISelectors = require("../../../src/client/firstfactor/UISelectors"); -import firstfactor from "../../../src/client/firstfactor/index"; +import UISelectors = require("../../../../src/client/firstfactor/UISelectors"); +import firstfactor from "../../../../src/client/firstfactor/index"; import JQueryMock = require("../mocks/jquery"); import Assert = require("assert"); import sinon = require("sinon"); diff --git a/test/client/mocks/jquery.ts b/test/unit/client/mocks/jquery.ts similarity index 100% rename from test/client/mocks/jquery.ts rename to test/unit/client/mocks/jquery.ts diff --git a/test/client/mocks/u2f-api.ts b/test/unit/client/mocks/u2f-api.ts similarity index 100% rename from test/client/mocks/u2f-api.ts rename to test/unit/client/mocks/u2f-api.ts diff --git a/test/client/secondfactor/TOTPValidator.test.ts b/test/unit/client/secondfactor/TOTPValidator.test.ts similarity index 93% rename from test/client/secondfactor/TOTPValidator.test.ts rename to test/unit/client/secondfactor/TOTPValidator.test.ts index dd10db8b5..260249045 100644 --- a/test/client/secondfactor/TOTPValidator.test.ts +++ b/test/unit/client/secondfactor/TOTPValidator.test.ts @@ -1,5 +1,5 @@ -import TOTPValidator = require("../../../src/client/secondfactor/TOTPValidator"); +import TOTPValidator = require("../../../../src/client/secondfactor/TOTPValidator"); import JQueryMock = require("../mocks/jquery"); import BluebirdPromise = require("bluebird"); import Assert = require("assert"); diff --git a/test/client/secondfactor/U2FValidator.test.ts b/test/unit/client/secondfactor/U2FValidator.test.ts similarity index 95% rename from test/client/secondfactor/U2FValidator.test.ts rename to test/unit/client/secondfactor/U2FValidator.test.ts index feb08297a..d9f72c320 100644 --- a/test/client/secondfactor/U2FValidator.test.ts +++ b/test/unit/client/secondfactor/U2FValidator.test.ts @@ -1,8 +1,8 @@ -import U2FValidator = require("../../../src/client/secondfactor/U2FValidator"); +import U2FValidator = require("../../../../src/client/secondfactor/U2FValidator"); import JQueryMock = require("../mocks/jquery"); import U2FApiMock = require("../mocks/u2f-api"); -import { SignMessage } from "../../../src/server/lib/routes/secondfactor/u2f/sign_request/SignMessage"; +import { SignMessage } from "../../../../src/server/lib/routes/secondfactor/u2f/sign_request/SignMessage"; import BluebirdPromise = require("bluebird"); import Assert = require("assert"); diff --git a/test/client/totp-register/totp-register.test.ts b/test/unit/client/totp-register/totp-register.test.ts similarity index 80% rename from test/client/totp-register/totp-register.test.ts rename to test/unit/client/totp-register/totp-register.test.ts index 0a445cc44..9d01ffe01 100644 --- a/test/client/totp-register/totp-register.test.ts +++ b/test/unit/client/totp-register/totp-register.test.ts @@ -2,8 +2,8 @@ import sinon = require("sinon"); import assert = require("assert"); -import UISelector = require("../../../src/client/totp-register/ui-selector"); -import TOTPRegister = require("../../../src/client/totp-register/totp-register"); +import UISelector = require("../../../../src/client/totp-register/ui-selector"); +import TOTPRegister = require("../../../../src/client/totp-register/totp-register"); describe("test totp-register", function() { let jqueryMock: any; diff --git a/test/server/AuthenticationRegulator.test.ts b/test/unit/server/AuthenticationRegulator.test.ts similarity index 89% rename from test/server/AuthenticationRegulator.test.ts rename to test/unit/server/AuthenticationRegulator.test.ts index 549ea0549..9eee3439d 100644 --- a/test/server/AuthenticationRegulator.test.ts +++ b/test/unit/server/AuthenticationRegulator.test.ts @@ -1,8 +1,8 @@ -import { AuthenticationRegulator } from "../../src/server/lib/AuthenticationRegulator"; -import UserDataStore from "../../src/server/lib/UserDataStore"; +import { AuthenticationRegulator } from "../../../src/server/lib/AuthenticationRegulator"; +import UserDataStore from "../../../src/server/lib/UserDataStore"; import MockDate = require("mockdate"); -import exceptions = require("../../src/server/lib/Exceptions"); +import exceptions = require("../../../src/server/lib/Exceptions"); import nedb = require("nedb"); describe("test authentication regulator", function() { diff --git a/test/server/ConfigurationAdapter.test.ts b/test/unit/server/ConfigurationAdapter.test.ts similarity index 95% rename from test/server/ConfigurationAdapter.test.ts rename to test/unit/server/ConfigurationAdapter.test.ts index 9c27f43af..c7f2b90a9 100644 --- a/test/server/ConfigurationAdapter.test.ts +++ b/test/unit/server/ConfigurationAdapter.test.ts @@ -1,6 +1,6 @@ import * as Assert from "assert"; -import { UserConfiguration } from "../../src/types/Configuration"; -import ConfigurationAdapter from "../../src/server/lib/ConfigurationAdapter"; +import { UserConfiguration } from "../../../src/types/Configuration"; +import ConfigurationAdapter from "../../../src/server/lib/ConfigurationAdapter"; describe("test config adapter", function() { function build_yaml_config(): UserConfiguration { diff --git a/test/server/DataPersistence.test.ts b/test/unit/server/DataPersistence.test.ts similarity index 95% rename from test/server/DataPersistence.test.ts rename to test/unit/server/DataPersistence.test.ts index ae4d85ff0..539285737 100644 --- a/test/server/DataPersistence.test.ts +++ b/test/unit/server/DataPersistence.test.ts @@ -2,9 +2,9 @@ import * as BluebirdPromise from "bluebird"; import * as request from "request"; -import Server from "../../src/server/lib/Server"; -import { UserConfiguration } from "../../src/types/Configuration"; -import { GlobalDependencies } from "../../src/types/Dependencies"; +import Server from "../../../src/server/lib/Server"; +import { UserConfiguration } from "../../../src/types/Configuration"; +import { GlobalDependencies } from "../../../src/types/Dependencies"; import * as tmp from "tmp"; import U2FMock = require("./mocks/u2f"); import { LdapjsClientMock } from "./mocks/ldapjs"; diff --git a/test/server/IdentityCheckMiddleware.test.ts b/test/unit/server/IdentityCheckMiddleware.test.ts similarity index 96% rename from test/server/IdentityCheckMiddleware.test.ts rename to test/unit/server/IdentityCheckMiddleware.test.ts index 12d40e837..5aa8d2f81 100644 --- a/test/server/IdentityCheckMiddleware.test.ts +++ b/test/unit/server/IdentityCheckMiddleware.test.ts @@ -1,8 +1,8 @@ import sinon = require("sinon"); -import IdentityValidator = require("../../src/server/lib/IdentityCheckMiddleware"); -import AuthenticationSession = require("../../src/server/lib/AuthenticationSession"); -import exceptions = require("../../src/server/lib/Exceptions"); +import IdentityValidator = require("../../../src/server/lib/IdentityCheckMiddleware"); +import AuthenticationSession = require("../../../src/server/lib/AuthenticationSession"); +import exceptions = require("../../../src/server/lib/Exceptions"); import assert = require("assert"); import winston = require("winston"); import Promise = require("bluebird"); diff --git a/test/server/LdapClient.test.ts b/test/unit/server/LdapClient.test.ts similarity index 98% rename from test/server/LdapClient.test.ts rename to test/unit/server/LdapClient.test.ts index 8d1abe947..729de3aca 100644 --- a/test/server/LdapClient.test.ts +++ b/test/unit/server/LdapClient.test.ts @@ -1,6 +1,6 @@ -import LdapClient = require("../../src/server/lib/LdapClient"); -import { LdapConfiguration } from "../../src/types/Configuration"; +import LdapClient = require("../../../src/server/lib/LdapClient"); +import { LdapConfiguration } from "../../../src/types/Configuration"; import sinon = require("sinon"); import BluebirdPromise = require("bluebird"); diff --git a/test/server/ServerConfiguration.test.ts b/test/unit/server/ServerConfiguration.test.ts similarity index 88% rename from test/server/ServerConfiguration.test.ts rename to test/unit/server/ServerConfiguration.test.ts index f9052bd99..5b1220d80 100644 --- a/test/server/ServerConfiguration.test.ts +++ b/test/unit/server/ServerConfiguration.test.ts @@ -9,9 +9,9 @@ import u2f = require("u2f"); import nodemailer = require("nodemailer"); import session = require("express-session"); -import { AppConfiguration, UserConfiguration } from "../../src/types/Configuration"; -import { GlobalDependencies, Nodemailer } from "../../src/types/Dependencies"; -import Server from "../../src/server/lib/Server"; +import { AppConfiguration, UserConfiguration } from "../../../src/types/Configuration"; +import { GlobalDependencies, Nodemailer } from "../../../src/types/Dependencies"; +import Server from "../../../src/server/lib/Server"; describe("test server configuration", function () { diff --git a/test/server/SessionConfigurationBuilder.test.ts b/test/unit/server/SessionConfigurationBuilder.test.ts similarity index 94% rename from test/server/SessionConfigurationBuilder.test.ts rename to test/unit/server/SessionConfigurationBuilder.test.ts index e6f94b23b..97f87ef0b 100644 --- a/test/server/SessionConfigurationBuilder.test.ts +++ b/test/unit/server/SessionConfigurationBuilder.test.ts @@ -1,6 +1,6 @@ -import SessionConfigurationBuilder from "../../src/server/lib/SessionConfigurationBuilder"; -import { AppConfiguration } from "../../src/types/Configuration"; -import { GlobalDependencies } from "../../src/types/Dependencies"; +import SessionConfigurationBuilder from "../../../src/server/lib/SessionConfigurationBuilder"; +import { AppConfiguration } from "../../../src/types/Configuration"; +import { GlobalDependencies } from "../../../src/types/Dependencies"; import ExpressSession = require("express-session"); import ConnectRedis = require("connect-redis"); import sinon = require("sinon"); diff --git a/test/server/TOTPValidator.test.ts b/test/unit/server/TOTPValidator.test.ts similarity index 91% rename from test/server/TOTPValidator.test.ts rename to test/unit/server/TOTPValidator.test.ts index e848e6947..0ef3faf51 100644 --- a/test/server/TOTPValidator.test.ts +++ b/test/unit/server/TOTPValidator.test.ts @@ -1,5 +1,5 @@ -import { TOTPValidator } from "../../src/server/lib/TOTPValidator"; +import { TOTPValidator } from "../../../src/server/lib/TOTPValidator"; import sinon = require("sinon"); import Promise = require("bluebird"); import SpeakeasyMock = require("./mocks/speakeasy"); diff --git a/test/server/UserDataStore.test.ts b/test/unit/server/UserDataStore.test.ts similarity index 97% rename from test/server/UserDataStore.test.ts rename to test/unit/server/UserDataStore.test.ts index 8c7b8128d..d482237a3 100644 --- a/test/server/UserDataStore.test.ts +++ b/test/unit/server/UserDataStore.test.ts @@ -1,6 +1,6 @@ -import UserDataStore from "../../src/server/lib/UserDataStore"; -import { U2FRegistrationDocument, Options } from "../../src/server/lib/UserDataStore"; +import UserDataStore from "../../../src/server/lib/UserDataStore"; +import { U2FRegistrationDocument, Options } from "../../../src/server/lib/UserDataStore"; import nedb = require("nedb"); import assert = require("assert"); diff --git a/test/server/access_control/AccessController.test.ts b/test/unit/server/access_control/AccessController.test.ts similarity index 92% rename from test/server/access_control/AccessController.test.ts rename to test/unit/server/access_control/AccessController.test.ts index 5e5f5e3ff..37ddb5836 100644 --- a/test/server/access_control/AccessController.test.ts +++ b/test/unit/server/access_control/AccessController.test.ts @@ -1,8 +1,8 @@ import assert = require("assert"); import winston = require("winston"); -import { AccessController } from "../../../src/server/lib/access_control/AccessController"; -import { ACLConfiguration } from "../../../src/types/Configuration"; +import { AccessController } from "../../../../src/server/lib/access_control/AccessController"; +import { ACLConfiguration } from "../../../../src/types/Configuration"; describe("test access control manager", function () { let accessController: AccessController; diff --git a/test/server/access_control/PatternBuilder.test.ts b/test/unit/server/access_control/PatternBuilder.test.ts similarity index 96% rename from test/server/access_control/PatternBuilder.test.ts rename to test/unit/server/access_control/PatternBuilder.test.ts index 391919fb7..82c3630bd 100644 --- a/test/server/access_control/PatternBuilder.test.ts +++ b/test/unit/server/access_control/PatternBuilder.test.ts @@ -2,8 +2,8 @@ import assert = require("assert"); import winston = require("winston"); -import PatternBuilder from "../../../src/server/lib/access_control/PatternBuilder"; -import { ACLConfiguration } from "../../../src/types/Configuration"; +import PatternBuilder from "../../../../src/server/lib/access_control/PatternBuilder"; +import { ACLConfiguration } from "../../../../src/types/Configuration"; describe("test access control manager", function () { describe("test access control pattern builder when no configuration is provided", () => { diff --git a/test/server/mocks/AccessController.ts b/test/unit/server/mocks/AccessController.ts similarity index 100% rename from test/server/mocks/AccessController.ts rename to test/unit/server/mocks/AccessController.ts diff --git a/test/server/mocks/AuthenticationRegulator.ts b/test/unit/server/mocks/AuthenticationRegulator.ts similarity index 100% rename from test/server/mocks/AuthenticationRegulator.ts rename to test/unit/server/mocks/AuthenticationRegulator.ts diff --git a/test/server/mocks/IdentityValidator.ts b/test/unit/server/mocks/IdentityValidator.ts similarity index 86% rename from test/server/mocks/IdentityValidator.ts rename to test/unit/server/mocks/IdentityValidator.ts index bd8dcd7e4..24898fc9f 100644 --- a/test/server/mocks/IdentityValidator.ts +++ b/test/unit/server/mocks/IdentityValidator.ts @@ -1,9 +1,9 @@ import sinon = require("sinon"); -import { IdentityValidable } from "../../../src/server/lib/IdentityCheckMiddleware"; +import { IdentityValidable } from "../../../../src/server/lib/IdentityCheckMiddleware"; import express = require("express"); import BluebirdPromise = require("bluebird"); -import { Identity } from "../../../src/types/Identity"; +import { Identity } from "../../../../src/types/Identity"; export interface IdentityValidableMock { diff --git a/test/server/mocks/LdapClient.ts b/test/unit/server/mocks/LdapClient.ts similarity index 100% rename from test/server/mocks/LdapClient.ts rename to test/unit/server/mocks/LdapClient.ts diff --git a/test/server/mocks/Notifier.ts b/test/unit/server/mocks/Notifier.ts similarity index 100% rename from test/server/mocks/Notifier.ts rename to test/unit/server/mocks/Notifier.ts diff --git a/test/server/mocks/ServerVariablesMock.ts b/test/unit/server/mocks/ServerVariablesMock.ts similarity index 89% rename from test/server/mocks/ServerVariablesMock.ts rename to test/unit/server/mocks/ServerVariablesMock.ts index b5dda7daa..d349e9565 100644 --- a/test/server/mocks/ServerVariablesMock.ts +++ b/test/unit/server/mocks/ServerVariablesMock.ts @@ -1,6 +1,6 @@ import sinon = require("sinon"); import express = require("express"); -import {  ServerVariables, VARIABLES_KEY }  from "../../../src/server/lib/ServerVariables"; +import {  ServerVariables, VARIABLES_KEY }  from "../../../../src/server/lib/ServerVariables"; export interface ServerVariablesMock { logger: any; diff --git a/test/server/mocks/TOTPValidator.ts b/test/unit/server/mocks/TOTPValidator.ts similarity index 100% rename from test/server/mocks/TOTPValidator.ts rename to test/unit/server/mocks/TOTPValidator.ts diff --git a/test/server/mocks/UserDataStore.ts b/test/unit/server/mocks/UserDataStore.ts similarity index 100% rename from test/server/mocks/UserDataStore.ts rename to test/unit/server/mocks/UserDataStore.ts diff --git a/test/server/mocks/express.ts b/test/unit/server/mocks/express.ts similarity index 100% rename from test/server/mocks/express.ts rename to test/unit/server/mocks/express.ts diff --git a/test/server/mocks/ldapjs.ts b/test/unit/server/mocks/ldapjs.ts similarity index 100% rename from test/server/mocks/ldapjs.ts rename to test/unit/server/mocks/ldapjs.ts diff --git a/test/server/mocks/nodemailer.ts b/test/unit/server/mocks/nodemailer.ts similarity index 100% rename from test/server/mocks/nodemailer.ts rename to test/unit/server/mocks/nodemailer.ts diff --git a/test/server/mocks/speakeasy.ts b/test/unit/server/mocks/speakeasy.ts similarity index 100% rename from test/server/mocks/speakeasy.ts rename to test/unit/server/mocks/speakeasy.ts diff --git a/test/server/mocks/u2f.ts b/test/unit/server/mocks/u2f.ts similarity index 100% rename from test/server/mocks/u2f.ts rename to test/unit/server/mocks/u2f.ts diff --git a/test/server/notifiers/FileSystemNotifier.test.ts b/test/unit/server/notifiers/FileSystemNotifier.test.ts similarity index 91% rename from test/server/notifiers/FileSystemNotifier.test.ts rename to test/unit/server/notifiers/FileSystemNotifier.test.ts index add77dcc6..eecab6573 100644 --- a/test/server/notifiers/FileSystemNotifier.test.ts +++ b/test/unit/server/notifiers/FileSystemNotifier.test.ts @@ -1,7 +1,7 @@ import * as sinon from "sinon"; import * as assert from "assert"; -import { FileSystemNotifier } from "../../../src/server/lib/notifiers/FileSystemNotifier"; +import { FileSystemNotifier } from "../../../../src/server/lib/notifiers/FileSystemNotifier"; import * as tmp from "tmp"; import * as fs from "fs"; import BluebirdPromise = require("bluebird"); diff --git a/test/server/notifiers/GMailNotifier.test.ts b/test/unit/server/notifiers/GMailNotifier.test.ts similarity index 93% rename from test/server/notifiers/GMailNotifier.test.ts rename to test/unit/server/notifiers/GMailNotifier.test.ts index c9deb8fef..08b6a112e 100644 --- a/test/server/notifiers/GMailNotifier.test.ts +++ b/test/unit/server/notifiers/GMailNotifier.test.ts @@ -3,7 +3,7 @@ import * as assert from "assert"; import BluebirdPromise = require("bluebird"); import NodemailerMock = require("../mocks/nodemailer"); -import GMailNotifier = require("../../../src/server/lib/notifiers/GMailNotifier"); +import GMailNotifier = require("../../../../src/server/lib/notifiers/GMailNotifier"); describe("test gmail notifier", function () { diff --git a/test/server/notifiers/NotifierFactory.test.ts b/test/unit/server/notifiers/NotifierFactory.test.ts similarity index 76% rename from test/server/notifiers/NotifierFactory.test.ts rename to test/unit/server/notifiers/NotifierFactory.test.ts index bf6c79a5f..8b4d8674c 100644 --- a/test/server/notifiers/NotifierFactory.test.ts +++ b/test/unit/server/notifiers/NotifierFactory.test.ts @@ -3,9 +3,9 @@ import * as sinon from "sinon"; import * as BluebirdPromise from "bluebird"; import * as assert from "assert"; -import { NotifierFactory } from "../../../src/server/lib/notifiers/NotifierFactory"; -import { GMailNotifier } from "../../../src/server/lib/notifiers/GMailNotifier"; -import { FileSystemNotifier } from "../../../src/server/lib/notifiers/FileSystemNotifier"; +import { NotifierFactory } from "../../../../src/server/lib/notifiers/NotifierFactory"; +import { GMailNotifier } from "../../../../src/server/lib/notifiers/GMailNotifier"; +import { FileSystemNotifier } from "../../../../src/server/lib/notifiers/FileSystemNotifier"; import NodemailerMock = require("../mocks/nodemailer"); diff --git a/test/server/requests.ts b/test/unit/server/requests.ts similarity index 98% rename from test/server/requests.ts rename to test/unit/server/requests.ts index a7837436e..557cf909e 100644 --- a/test/server/requests.ts +++ b/test/unit/server/requests.ts @@ -4,7 +4,7 @@ import request = require("request"); import assert = require("assert"); import express = require("express"); import nodemailer = require("nodemailer"); -import Endpoints = require("../../src/server/endpoints"); +import Endpoints = require("../../../src/server/endpoints"); import NodemailerMock = require("./mocks/nodemailer"); diff --git a/test/server/routes/firstfactor/post.test.ts b/test/unit/server/routes/firstfactor/post.test.ts similarity index 94% rename from test/server/routes/firstfactor/post.test.ts rename to test/unit/server/routes/firstfactor/post.test.ts index 25baab59a..b2bcfff27 100644 --- a/test/server/routes/firstfactor/post.test.ts +++ b/test/unit/server/routes/firstfactor/post.test.ts @@ -4,10 +4,10 @@ import BluebirdPromise = require("bluebird"); import assert = require("assert"); import winston = require("winston"); -import FirstFactorPost = require("../../../../src/server/lib/routes/firstfactor/post"); -import exceptions = require("../../../../src/server/lib/Exceptions"); -import AuthenticationSession = require("../../../../src/server/lib/AuthenticationSession"); -import Endpoints = require("../../../../src/server/endpoints"); +import FirstFactorPost = require("../../../../../src/server/lib/routes/firstfactor/post"); +import exceptions = require("../../../../../src/server/lib/Exceptions"); +import AuthenticationSession = require("../../../../../src/server/lib/AuthenticationSession"); +import Endpoints = require("../../../../../src/server/endpoints"); import AuthenticationRegulatorMock = require("../../mocks/AuthenticationRegulator"); import AccessControllerMock = require("../../mocks/AccessController"); diff --git a/test/server/routes/password-reset/identity/PasswordResetHandler.test.ts b/test/unit/server/routes/password-reset/identity/PasswordResetHandler.test.ts similarity index 94% rename from test/server/routes/password-reset/identity/PasswordResetHandler.test.ts rename to test/unit/server/routes/password-reset/identity/PasswordResetHandler.test.ts index f69edf5b3..f19e77ae7 100644 --- a/test/server/routes/password-reset/identity/PasswordResetHandler.test.ts +++ b/test/unit/server/routes/password-reset/identity/PasswordResetHandler.test.ts @@ -1,6 +1,6 @@ -import PasswordResetHandler from "../../../../../src/server/lib/routes/password-reset/identity/PasswordResetHandler"; -import LdapClient = require("../../../../../src/server/lib/LdapClient"); +import PasswordResetHandler from "../../../../../../src/server/lib/routes/password-reset/identity/PasswordResetHandler"; +import LdapClient = require("../../../../../../src/server/lib/LdapClient"); import sinon = require("sinon"); import winston = require("winston"); import assert = require("assert"); diff --git a/test/server/routes/password-reset/post.test.ts b/test/unit/server/routes/password-reset/post.test.ts similarity index 93% rename from test/server/routes/password-reset/post.test.ts rename to test/unit/server/routes/password-reset/post.test.ts index 9362de8a5..1ef436e8b 100644 --- a/test/server/routes/password-reset/post.test.ts +++ b/test/unit/server/routes/password-reset/post.test.ts @@ -1,7 +1,7 @@ -import PasswordResetFormPost = require("../../../../src/server/lib/routes/password-reset/form/post"); -import LdapClient = require("../../../../src/server/lib/LdapClient"); -import AuthenticationSession = require("../../../../src/server/lib/AuthenticationSession"); +import PasswordResetFormPost = require("../../../../../src/server/lib/routes/password-reset/form/post"); +import LdapClient = require("../../../../../src/server/lib/LdapClient"); +import AuthenticationSession = require("../../../../../src/server/lib/AuthenticationSession"); import sinon = require("sinon"); import winston = require("winston"); import assert = require("assert"); diff --git a/test/server/routes/secondfactor/totp/register/RegistrationHandler.test.ts b/test/unit/server/routes/secondfactor/totp/register/RegistrationHandler.test.ts similarity index 91% rename from test/server/routes/secondfactor/totp/register/RegistrationHandler.test.ts rename to test/unit/server/routes/secondfactor/totp/register/RegistrationHandler.test.ts index e3f2cb89b..2cb0be33d 100644 --- a/test/server/routes/secondfactor/totp/register/RegistrationHandler.test.ts +++ b/test/unit/server/routes/secondfactor/totp/register/RegistrationHandler.test.ts @@ -1,8 +1,8 @@ import sinon = require("sinon"); import winston = require("winston"); -import RegistrationHandler from "../../../../../../src/server/lib/routes/secondfactor/totp/identity/RegistrationHandler"; -import { Identity } from "../../../../../../src/types/Identity"; -import AuthenticationSession = require("../../../../../../src/server/lib/AuthenticationSession"); +import RegistrationHandler from "../../../../../../../src/server/lib/routes/secondfactor/totp/identity/RegistrationHandler"; +import { Identity } from "../../../../../../../src/types/Identity"; +import AuthenticationSession = require("../../../../../../../src/server/lib/AuthenticationSession"); import assert = require("assert"); import BluebirdPromise = require("bluebird"); diff --git a/test/server/routes/secondfactor/totp/sign/post.test.ts b/test/unit/server/routes/secondfactor/totp/sign/post.test.ts similarity index 91% rename from test/server/routes/secondfactor/totp/sign/post.test.ts rename to test/unit/server/routes/secondfactor/totp/sign/post.test.ts index d12595357..1a1bd998a 100644 --- a/test/server/routes/secondfactor/totp/sign/post.test.ts +++ b/test/unit/server/routes/secondfactor/totp/sign/post.test.ts @@ -4,9 +4,9 @@ import sinon = require("sinon"); import assert = require("assert"); import winston = require("winston"); -import exceptions = require("../../../../../../src/server/lib/Exceptions"); -import AuthenticationSession = require("../../../../../../src/server/lib/AuthenticationSession"); -import SignPost = require("../../../../../../src/server/lib/routes/secondfactor/totp/sign/post"); +import exceptions = require("../../../../../../../src/server/lib/Exceptions"); +import AuthenticationSession = require("../../../../../../../src/server/lib/AuthenticationSession"); +import SignPost = require("../../../../../../../src/server/lib/routes/secondfactor/totp/sign/post"); import ExpressMock = require("../../../../mocks/express"); import UserDataStoreMock = require("../../../../mocks/UserDataStore"); diff --git a/test/server/routes/secondfactor/u2f/identity/RegistrationHandler.test.ts b/test/unit/server/routes/secondfactor/u2f/identity/RegistrationHandler.test.ts similarity index 91% rename from test/server/routes/secondfactor/u2f/identity/RegistrationHandler.test.ts rename to test/unit/server/routes/secondfactor/u2f/identity/RegistrationHandler.test.ts index ba0db3494..2126cae5c 100644 --- a/test/server/routes/secondfactor/u2f/identity/RegistrationHandler.test.ts +++ b/test/unit/server/routes/secondfactor/u2f/identity/RegistrationHandler.test.ts @@ -3,9 +3,9 @@ import winston = require("winston"); import assert = require("assert"); import BluebirdPromise = require("bluebird"); -import { Identity } from "../../../../../../src/types/Identity"; -import RegistrationHandler from "../../../../../../src/server/lib/routes/secondfactor/u2f/identity/RegistrationHandler"; -import AuthenticationSession = require("../../../../../../src/server/lib/AuthenticationSession"); +import { Identity } from "../../../../../../../src/types/Identity"; +import RegistrationHandler from "../../../../../../../src/server/lib/routes/secondfactor/u2f/identity/RegistrationHandler"; +import AuthenticationSession = require("../../../../../../../src/server/lib/AuthenticationSession"); import ExpressMock = require("../../../../mocks/express"); import UserDataStoreMock = require("../../../../mocks/UserDataStore"); diff --git a/test/server/routes/secondfactor/u2f/register/post.test.ts b/test/unit/server/routes/secondfactor/u2f/register/post.test.ts similarity index 95% rename from test/server/routes/secondfactor/u2f/register/post.test.ts rename to test/unit/server/routes/secondfactor/u2f/register/post.test.ts index a1d2f7781..21a80353c 100644 --- a/test/server/routes/secondfactor/u2f/register/post.test.ts +++ b/test/unit/server/routes/secondfactor/u2f/register/post.test.ts @@ -2,8 +2,8 @@ import sinon = require("sinon"); import BluebirdPromise = require("bluebird"); import assert = require("assert"); -import U2FRegisterPost = require("../../../../../../src/server/lib/routes/secondfactor/u2f/register/post"); -import AuthenticationSession = require("../../../../../../src/server/lib/AuthenticationSession"); +import U2FRegisterPost = require("../../../../../../../src/server/lib/routes/secondfactor/u2f/register/post"); +import AuthenticationSession = require("../../../../../../../src/server/lib/AuthenticationSession"); import winston = require("winston"); import ExpressMock = require("../../../../mocks/express"); diff --git a/test/server/routes/secondfactor/u2f/register_request/get.test.ts b/test/unit/server/routes/secondfactor/u2f/register_request/get.test.ts similarity index 93% rename from test/server/routes/secondfactor/u2f/register_request/get.test.ts rename to test/unit/server/routes/secondfactor/u2f/register_request/get.test.ts index 1f5405a69..55c2d74a7 100644 --- a/test/server/routes/secondfactor/u2f/register_request/get.test.ts +++ b/test/unit/server/routes/secondfactor/u2f/register_request/get.test.ts @@ -2,8 +2,8 @@ import sinon = require("sinon"); import BluebirdPromise = require("bluebird"); import assert = require("assert"); -import U2FRegisterRequestGet = require("../../../../../../src/server/lib/routes/secondfactor/u2f/register_request/get"); -import AuthenticationSession = require("../../../../../../src/server/lib/AuthenticationSession"); +import U2FRegisterRequestGet = require("../../../../../../../src/server/lib/routes/secondfactor/u2f/register_request/get"); +import AuthenticationSession = require("../../../../../../../src/server/lib/AuthenticationSession"); import winston = require("winston"); import ExpressMock = require("../../../../mocks/express"); diff --git a/test/server/routes/secondfactor/u2f/sign/post.test.ts b/test/unit/server/routes/secondfactor/u2f/sign/post.test.ts similarity index 94% rename from test/server/routes/secondfactor/u2f/sign/post.test.ts rename to test/unit/server/routes/secondfactor/u2f/sign/post.test.ts index 0308dfec7..f9d243867 100644 --- a/test/server/routes/secondfactor/u2f/sign/post.test.ts +++ b/test/unit/server/routes/secondfactor/u2f/sign/post.test.ts @@ -2,8 +2,8 @@ import sinon = require("sinon"); import BluebirdPromise = require("bluebird"); import assert = require("assert"); -import U2FSignPost = require("../../../../../../src/server/lib/routes/secondfactor/u2f/sign/post"); -import AuthenticationSession = require("../../../../../../src/server/lib/AuthenticationSession"); +import U2FSignPost = require("../../../../../../../src/server/lib/routes/secondfactor/u2f/sign/post"); +import AuthenticationSession = require("../../../../../../../src/server/lib/AuthenticationSession"); import winston = require("winston"); import ExpressMock = require("../../../../mocks/express"); diff --git a/test/server/routes/secondfactor/u2f/sign_request/get.test.ts b/test/unit/server/routes/secondfactor/u2f/sign_request/get.test.ts similarity index 88% rename from test/server/routes/secondfactor/u2f/sign_request/get.test.ts rename to test/unit/server/routes/secondfactor/u2f/sign_request/get.test.ts index 3ffc5dbb9..365f44672 100644 --- a/test/server/routes/secondfactor/u2f/sign_request/get.test.ts +++ b/test/unit/server/routes/secondfactor/u2f/sign_request/get.test.ts @@ -2,8 +2,8 @@ import sinon = require("sinon"); import BluebirdPromise = require("bluebird"); import assert = require("assert"); -import U2FSignRequestGet = require("../../../../../../src/server/lib/routes/secondfactor/u2f/sign_request/get"); -import AuthenticationSession = require("../../../../../../src/server/lib/AuthenticationSession"); +import U2FSignRequestGet = require("../../../../../../../src/server/lib/routes/secondfactor/u2f/sign_request/get"); +import AuthenticationSession = require("../../../../../../../src/server/lib/AuthenticationSession"); import winston = require("winston"); import ExpressMock = require("../../../../mocks/express"); @@ -12,7 +12,7 @@ import ServerVariablesMock = require("../../../../mocks/ServerVariablesMock"); import U2FMock = require("../../../../mocks/u2f"); import U2f = require("u2f"); -import { SignMessage } from "../../../../../../src/server/lib/routes/secondfactor/u2f/sign_request/SignMessage"; +import { SignMessage } from "../../../../../../../src/server/lib/routes/secondfactor/u2f/sign_request/SignMessage"; describe("test u2f routes: sign_request", function () { let req: ExpressMock.RequestMock; diff --git a/test/server/routes/verify/get.test.ts b/test/unit/server/routes/verify/get.test.ts similarity index 95% rename from test/server/routes/verify/get.test.ts rename to test/unit/server/routes/verify/get.test.ts index 3f93f0a3c..0981a6c3d 100644 --- a/test/server/routes/verify/get.test.ts +++ b/test/unit/server/routes/verify/get.test.ts @@ -1,7 +1,7 @@ import assert = require("assert"); -import VerifyGet = require("../../../../src/server/lib/routes/verify/get"); -import AuthenticationSession = require("../../../../src/server/lib/AuthenticationSession"); +import VerifyGet = require("../../../../../src/server/lib/routes/verify/get"); +import AuthenticationSession = require("../../../../../src/server/lib/AuthenticationSession"); import sinon = require("sinon"); import winston = require("winston"); diff --git a/test/server/server/PrivatePages.ts b/test/unit/server/server/PrivatePages.ts similarity index 94% rename from test/server/server/PrivatePages.ts rename to test/unit/server/server/PrivatePages.ts index dcc690ab5..5e3d88c0a 100644 --- a/test/server/server/PrivatePages.ts +++ b/test/unit/server/server/PrivatePages.ts @@ -1,15 +1,15 @@ -import Server from "../../../src/server/lib/Server"; -import LdapClient = require("../../../src/server/lib/LdapClient"); +import Server from "../../../../src/server/lib/Server"; +import LdapClient = require("../../../../src/server/lib/LdapClient"); import BluebirdPromise = require("bluebird"); import speakeasy = require("speakeasy"); import request = require("request"); import nedb = require("nedb"); -import { GlobalDependencies } from "../../../src/types/Dependencies"; -import { TOTPSecret } from "../../../src/types/TOTPSecret"; +import { GlobalDependencies } from "../../../../src/types/Dependencies"; +import { TOTPSecret } from "../../../../src/types/TOTPSecret"; import U2FMock = require("./../mocks/u2f"); -import Endpoints = require("../../../src/server/endpoints"); +import Endpoints = require("../../../../src/server/endpoints"); import Requests = require("../requests"); import Assert = require("assert"); import Sinon = require("sinon"); diff --git a/test/server/server/PublicPages.ts b/test/unit/server/server/PublicPages.ts similarity index 92% rename from test/server/server/PublicPages.ts rename to test/unit/server/server/PublicPages.ts index 5d8fcec38..b6b5ccae5 100644 --- a/test/server/server/PublicPages.ts +++ b/test/unit/server/server/PublicPages.ts @@ -1,15 +1,15 @@ -import Server from "../../../src/server/lib/Server"; -import LdapClient = require("../../../src/server/lib/LdapClient"); +import Server from "../../../../src/server/lib/Server"; +import LdapClient = require("../../../../src/server/lib/LdapClient"); import BluebirdPromise = require("bluebird"); import speakeasy = require("speakeasy"); import Request = require("request"); import nedb = require("nedb"); -import { GlobalDependencies } from "../../../src/types/Dependencies"; -import { TOTPSecret } from "../../../src/types/TOTPSecret"; +import { GlobalDependencies } from "../../../../src/types/Dependencies"; +import { TOTPSecret } from "../../../../src/types/TOTPSecret"; import U2FMock = require("./../mocks/u2f"); -import Endpoints = require("../../../src/server/endpoints"); +import Endpoints = require("../../../../src/server/endpoints"); import Requests = require("../requests"); import Assert = require("assert"); import Sinon = require("sinon"); diff --git a/test/server/server/Server.test.ts b/test/unit/server/server/Server.test.ts similarity index 96% rename from test/server/server/Server.test.ts rename to test/unit/server/server/Server.test.ts index b7396aa05..b3a7969ca 100644 --- a/test/server/server/Server.test.ts +++ b/test/unit/server/server/Server.test.ts @@ -1,17 +1,17 @@ -import Server from "../../../src/server/lib/Server"; -import LdapClient = require("../../../src/server/lib/LdapClient"); +import Server from "../../../../src/server/lib/Server"; +import LdapClient = require("../../../../src/server/lib/LdapClient"); import { LdapjsClientMock } from "./../mocks/ldapjs"; import BluebirdPromise = require("bluebird"); import speakeasy = require("speakeasy"); import request = require("request"); import nedb = require("nedb"); -import { GlobalDependencies } from "../../../src/types/Dependencies"; -import { TOTPSecret } from "../../../src/types/TOTPSecret"; +import { GlobalDependencies } from "../../../../src/types/Dependencies"; +import { TOTPSecret } from "../../../../src/types/TOTPSecret"; import U2FMock = require("./../mocks/u2f"); -import Endpoints = require("../../../src/server/endpoints"); +import Endpoints = require("../../../../src/server/endpoints"); import Requests = require("../requests"); import Assert = require("assert"); import Sinon = require("sinon"); diff --git a/test/server/user_data_store/authentication_audit.test.ts b/test/unit/server/user_data_store/authentication_audit.test.ts similarity index 96% rename from test/server/user_data_store/authentication_audit.test.ts rename to test/unit/server/user_data_store/authentication_audit.test.ts index c0037fd01..5d1b824f7 100644 --- a/test/server/user_data_store/authentication_audit.test.ts +++ b/test/unit/server/user_data_store/authentication_audit.test.ts @@ -3,7 +3,7 @@ import * as assert from "assert"; import * as Promise from "bluebird"; import * as sinon from "sinon"; import * as MockDate from "mockdate"; -import UserDataStore from "../../../src/server/lib/UserDataStore"; +import UserDataStore from "../../../../src/server/lib/UserDataStore"; import nedb = require("nedb"); describe("test user data store", function() { diff --git a/test/server/user_data_store/totp_secret.test.ts b/test/unit/server/user_data_store/totp_secret.test.ts similarity index 96% rename from test/server/user_data_store/totp_secret.test.ts rename to test/unit/server/user_data_store/totp_secret.test.ts index 08adcf6dc..4a5b3922f 100644 --- a/test/server/user_data_store/totp_secret.test.ts +++ b/test/unit/server/user_data_store/totp_secret.test.ts @@ -3,7 +3,7 @@ import * as assert from "assert"; import * as Promise from "bluebird"; import * as sinon from "sinon"; import * as MockDate from "mockdate"; -import UserDataStore from "../../../src/server/lib/UserDataStore"; +import UserDataStore from "../../../../src/server/lib/UserDataStore"; import nedb = require("nedb"); describe("test user data store", function() {