git.fiddlerwoaroof.com
installer_test.cc
bf756dea
 #include <functional>
 #include <memory>
 #include <string>
 #include <vector>
 
66796de1
 #include "installer.h"
bf756dea
 #include "user.h"
 #include "token.h"
 #include "test_util.h"
 
 class mock_tokens : public tokens_ifc {
     public:
         mutable std::string captured_token;
         void save (const user &user, const std::string &token) const override {
             captured_token = token;
         }
 };
 
 class fake_unistd : public unistd_ifc {
     private:
         std::string user_name_;
     public:
         fake_unistd(const std::string &user_name) : user_name_(user_name) {}
         const char *getlogin() const override {
             return user_name_.c_str();
         }
 };
66796de1
 
55530c94
 class fail_unistd : public unistd_ifc {
     public:
         const char *getlogin() const override {
             return nullptr;
         }
 };
 
bf756dea
 class fake_directory : public directory_ifc {
     private:
         std::string expected_user_name_;
     public:
         fake_directory(const std::string &expected_user_name) : expected_user_name_(expected_user_name) {
         }
         std::vector<user> find_user (const std::string &user_name) const override {
             std::vector<user> rval;
             if (user_name == expected_user_name_) {
                 rval.push_back(user());
             }
             return rval;
         }
 
 };
 
 int installs_token() {
66796de1
     //given
bf756dea
     std::string user_name("user");
     std::string token("token");
     auto  test_tokens = std::make_shared<mock_tokens>();
     tokens tokens{test_tokens};
     unistd unistd(std::make_shared<fake_unistd>(user_name));
     directory directory(std::make_shared<fake_directory>(user_name));
     installer_ifc::generator generator = [&] { return token; };
 
     installer installer = installer::create (tokens, unistd, directory, generator);
66796de1
 
     //when
10081f1a
     std::string result = installer.install_token();
66796de1
 
     //then
bf756dea
     check(test_tokens->captured_token == token, "installed wrong token");
10081f1a
     check(result == token, "installer returned wrong token");
bf756dea
     succeed();
66796de1
 }
 
55530c94
 int unistd_does_not_find_user_name() {
     //given
     std::string user_name("user");
     std::string token("token");
     auto  test_tokens = std::make_shared<mock_tokens>();
     tokens tokens{test_tokens};
     unistd unistd(std::make_shared<fail_unistd>());
     directory directory(std::make_shared<fake_directory>(user_name));
     installer_ifc::generator generator = [&] { return token; };
 
     installer installer = installer::create (tokens, unistd, directory, generator);
 
 
     //when
     installer.install_token();
bf756dea
 
55530c94
     //then
     check(test_tokens->captured_token == "", "should not have installed a token");
     succeed();
 }
bf756dea
 
43a993d5
 int directory_finds_no_user_info() {
     std::string user_name("user");
     std::string token("token");
     auto  test_tokens = std::make_shared<mock_tokens>();
     tokens tokens{test_tokens};
     unistd unistd(std::make_shared<fake_unistd>(user_name));
     directory directory(std::make_shared<fake_directory>("not the user"));
     installer_ifc::generator generator = [&] { return token; };
 
     installer installer = installer::create (tokens, unistd, directory, generator);
 
     //when
     installer.install_token();
 
     //then
     check(test_tokens->captured_token == "", "installed wrong token");
     succeed();
 }
 
bf756dea
 int run_tests() {
     test(installs_token);
55530c94
     test(unistd_does_not_find_user_name);
43a993d5
     test(directory_finds_no_user_info);
bf756dea
     succeed();
 }
 
 int main(int argc, char *argv[]) {
     return !run_tests();
 }
66796de1