From bc75f4d33664c7462e9701e0e9dae60d0c73711b Mon Sep 17 00:00:00 2001 From: Alex Ling Date: Tue, 25 Feb 2020 19:00:10 +0000 Subject: [PATCH] Add unit test --- Makefile | 3 ++ spec/asset/test-config.yml | 2 ++ spec/config_spec.cr | 14 ++++++++ spec/spec_helper.cr | 3 ++ spec/storage_spec.cr | 66 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 88 insertions(+) create mode 100644 spec/asset/test-config.yml create mode 100644 spec/config_spec.cr create mode 100644 spec/spec_helper.cr create mode 100644 spec/storage_spec.cr diff --git a/Makefile b/Makefile index 859e5e3..199745b 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,9 @@ libs: run: crystal run src/mango.cr --error-trace +test: + crystal spec + install: cp mango $(INSTALL_DIR)/mango diff --git a/spec/asset/test-config.yml b/spec/asset/test-config.yml new file mode 100644 index 0000000..dd2ad06 --- /dev/null +++ b/spec/asset/test-config.yml @@ -0,0 +1,2 @@ +--- +port: 3000 diff --git a/spec/config_spec.cr b/spec/config_spec.cr new file mode 100644 index 0000000..3299a0e --- /dev/null +++ b/spec/config_spec.cr @@ -0,0 +1,14 @@ +require "./spec_helper" + +describe Config do + it "creates config if it does not exist" do + tempfile = File.tempfile "mango-test-config" + config = Config.load tempfile.path + File.exists?(tempfile.path).should be_true + tempfile.delete + end + it "correctly loads config" do + config = Config.load "spec/asset/test-config.yml" + config.port.should eq 3000 + end +end diff --git a/spec/spec_helper.cr b/spec/spec_helper.cr new file mode 100644 index 0000000..3040af2 --- /dev/null +++ b/spec/spec_helper.cr @@ -0,0 +1,3 @@ +require "spec" +require "../src/context" +require "../src/server" diff --git a/spec/storage_spec.cr b/spec/storage_spec.cr new file mode 100644 index 0000000..2b42711 --- /dev/null +++ b/spec/storage_spec.cr @@ -0,0 +1,66 @@ +require "./spec_helper" + +describe Storage do + temp_config = File.tempfile "mango-test-config" + temp_db = File.tempfile "mango-test-db" + config = Config.load temp_config.path + user_token = nil + admin_token = nil + + it "creates DB at given path" do + storage = Storage.new temp_db.path, MLogger.new config + File.exists?(temp_db.path).should be_true + end + it "deletes user" do + storage = Storage.new temp_db.path, MLogger.new config + storage.delete_user "admin" + end + it "creates new user" do + storage = Storage.new temp_db.path, MLogger.new config + storage.new_user "user", "123456", false + storage.new_user "admin", "123456", true + end + it "verifies username/password combination" do + storage = Storage.new temp_db.path, MLogger.new config + user_token = storage.verify_user "user", "123456" + admin_token = storage.verify_user "admin", "123456" + user_token.should_not be_nil + admin_token.should_not be_nil + end + it "rejects duplicate username" do + storage = Storage.new temp_db.path, MLogger.new config + expect_raises SQLite3::Exception, + "UNIQUE constraint failed: users.username" do + storage.new_user "admin", "123456", true + end + end + it "verifies token" do + storage = Storage.new temp_db.path, MLogger.new config + token = storage.verify_token user_token + token.should eq "user" + end + it "verfies admin token" do + storage = Storage.new temp_db.path, MLogger.new config + storage.verify_admin(admin_token).should be_true + end + it "rejects non-admin token" do + storage = Storage.new temp_db.path, MLogger.new config + storage.verify_admin(user_token).should be_false + end + it "updates user" do + storage = Storage.new temp_db.path, MLogger.new config + storage.update_user "admin", "admin", "654321", true + token = storage.verify_user "admin", "654321" + token.should eq admin_token + end + it "logs user out" do + storage = Storage.new temp_db.path, MLogger.new config + storage.logout user_token + storage.logout admin_token + storage.verify_token(user_token).should be_nil + storage.verify_token(admin_token).should be_nil + end + + temp_config.delete + temp_db.delete +end