git.fiddlerwoaroof.com
Browse code

adds user token supplier collaborator

Greg Wiley authored on 13/04/2017 16:35:56
Showing 5 changed files
... ...
@@ -5,14 +5,13 @@
5 5
 
6 6
 #include "user.h"
7 7
 
8
-class token {
9
-       std::string value_
8
+
9
+class user_token_supplier {
10 10
     public:
11
-       token(const std::string &value) : value_(value) {}
12
-       std::string value() { return value_; }
13
-}
11
+       virtual std::string token(const user_p user) = 0;
12
+};
14 13
 
15
-shared_ptr<token> create_token(std::shared_ptr<user> user);
14
+typedef std::shared_ptr<user_token_supplier> user_token_supplier_p;
16 15
 
17 16
 int validate_token(const char *user, const char *token);
18 17
 
... ...
@@ -15,7 +15,7 @@ class user {
15 15
 typedef std::shared_ptr<user> user_p;
16 16
 class directory {
17 17
     public:
18
-        virtual ~directory() {}
18
+       virtual ~directory() {}
19 19
         virtual const user_p find_user(const std::string &user_name) = 0;
20 20
 };
21 21
 
... ...
@@ -1,8 +1,16 @@
1 1
 #include <string>
2
+#include <iostream>
2 3
 
3 4
 #include "validator.h"
4 5
 
5 6
 bool validator::validate(const std::string &user_name, const std::string &token) {
6
-    return directory_->find_user(user_name) && token == "token";
7
+    user_p found_user = directory_->find_user(user_name);
8
+
9
+    if (!found_user) {
10
+        return false;
11
+    }
12
+
13
+    std::string user_token = user_token_supplier_->token(found_user);
14
+    return user_token == token;
7 15
 }
8 16
 
... ...
@@ -4,12 +4,16 @@
4 4
 #include <string>
5 5
 
6 6
 #include "user.h"
7
+#include "token.h"
7 8
 
8 9
 class validator {
9 10
     private:
10 11
         directory_p directory_;
12
+        user_token_supplier_p user_token_supplier_;
11 13
     public:
12
-        validator(const directory_p &directory): directory_(directory) {}
14
+        validator(const directory_p &directory, const user_token_supplier_p &user_token_supplier):
15
+            directory_(directory),
16
+            user_token_supplier_(user_token_supplier) {}
13 17
         bool validate(const std::string &user, const std::string &token);
14 18
 };
15 19
 
... ...
@@ -1,6 +1,7 @@
1 1
 #include "validator.h"
2 2
 #include "user.h"
3 3
 #include "test_util.h"
4
+#include "token.h"
4 5
 
5 6
 class fake_directory : public directory {
6 7
     private:
... ...
@@ -19,13 +20,26 @@ class fake_directory : public directory {
19 20
         }
20 21
 };
21 22
 
23
+class fake_user_token_supplier : public user_token_supplier {
24
+    private:
25
+        std::string token_;
26
+    public:
27
+        fake_user_token_supplier(const std::string &token) : token_(token) {}
28
+        fake_user_token_supplier() : token_("_NOT_A_TOKEN") {}
29
+        virtual std::string token(const user_p user)  {
30
+            return token_;
31
+        }
32
+};
33
+
22 34
 
23 35
 bool validator_validates() {
24 36
 
25
-   // given
37
+    // given
38
+    std::string token = "token";
39
+    user_token_supplier_p user_token_supplier(new fake_user_token_supplier(token));
26 40
     std::string user_name = "msmith";
27 41
     directory_p directory(new fake_directory(user_name));
28
-    validator validator(directory);
42
+    validator validator(directory, user_token_supplier);
29 43
 
30 44
 
31 45
     // when
... ...
@@ -40,12 +54,14 @@ bool validator_validates() {
40 54
 bool validator_fails_unknown_user() {
41 55
 
42 56
    // given
57
+   std::string token = "token";
58
+   user_token_supplier_p user_token_supplier(new fake_user_token_supplier(token));
43 59
    directory_p directory(new fake_directory);
44
-   validator validator(directory);
60
+   validator validator(directory, user_token_supplier);
45 61
 
46 62
 
47 63
    // when
48
-   bool actual = validator.validate("notuser", "token");
64
+   bool actual = validator.validate("notuser", token);
49 65
 
50 66
 
51 67
    // then
... ...
@@ -56,13 +72,14 @@ bool validator_fails_unknown_user() {
56 72
 bool validator_fails_incorrect_token() {
57 73
 
58 74
    // given
59
-    std::string user_name = "user";
75
+    user_token_supplier_p user_token_supplier(new fake_user_token_supplier);
76
+    std::string user_name = "msmith";
60 77
     directory_p directory(new fake_directory(user_name));
61
-    validator validator(directory);
78
+    validator validator(directory, user_token_supplier);
62 79
 
63 80
 
64 81
    // when
65
-   bool actual = validator.validate(user_name, "nottoken");
82
+   bool actual = validator.validate(user_name, "token");
66 83
 
67 84
 
68 85
    // then
... ...
@@ -78,7 +95,6 @@ bool run_tests() {
78 95
     test(validator_fails_unknown_user);
79 96
     test(validator_fails_incorrect_token);
80 97
     succeed();
81
-
82 98
 }
83 99
 
84 100
 int main(int argc, char *argv[]) {