Browse Source

Improved connection manager and added new tests

Arnaud Vergnet 4 years ago
parent
commit
5aa3afd383
3 changed files with 170 additions and 15 deletions
  1. 132
    4
      __tests__/managers/ConnectionManager.test.js
  2. 35
    11
      managers/ConnectionManager.js
  3. 3
    0
      package.json

+ 132
- 4
__tests__/managers/ConnectionManager.test.js View File

@@ -1,15 +1,143 @@
1 1
 import React from 'react';
2 2
 import ConnectionManager, {ERROR_TYPE} from "../../managers/ConnectionManager";
3
+import * as SecureStore from 'expo-secure-store';
4
+
5
+let fetch = require('isomorphic-fetch'); // fetch is not implemented in nodeJS but in react-native
3 6
 
4
-const fetch = require('isomorphic-fetch'); // fetch is not implemented in nodeJS but in react-native
5 7
 const c = ConnectionManager.getInstance();
6 8
 
7 9
 test("connect bad credentials", () => {
8
-    return expect(c.connect('truc', 'chose'))
10
+    jest.spyOn(global, 'fetch').mockImplementationOnce(() => {
11
+        return Promise.resolve({
12
+            json: () => {
13
+                return {
14
+                    state: false,
15
+                    message: 'Adresse mail ou mot de passe incorrect',
16
+                    token: ''
17
+                }
18
+            },
19
+        })
20
+    });
21
+    return expect(c.connect('email', 'password'))
9 22
         .rejects.toBe(ERROR_TYPE.BAD_CREDENTIALS);
10 23
 });
11 24
 
12 25
 test("connect good credentials", () => {
13
-    return expect(c.connect('vergnet@etud.insa-toulouse.fr', 'Coucoù512'))
14
-        .resolves.toBe('test');
26
+    jest.spyOn(global, 'fetch').mockImplementationOnce(() => {
27
+        return Promise.resolve({
28
+            json: () => {
29
+                return     {
30
+                    state: true,
31
+                    message: 'Connexion confirmée',
32
+                    token: 'token'
33
+                }
34
+            },
35
+        })
36
+    });
37
+    jest.spyOn(SecureStore, 'setItemAsync').mockImplementationOnce(() => {
38
+        return Promise.resolve(true);
39
+    });
40
+    return expect(c.connect('email', 'password')).resolves.toBeTruthy();
41
+});
42
+
43
+test("connect good credentials, fail save token", () => {
44
+    jest.spyOn(global, 'fetch').mockImplementationOnce(() => {
45
+        return Promise.resolve({
46
+            json: () => {
47
+                return     {
48
+                    state: true,
49
+                    message: 'Connexion confirmée',
50
+                    token: 'token'
51
+                }
52
+            },
53
+        })
54
+    });
55
+    jest.spyOn(SecureStore, 'setItemAsync').mockImplementationOnce(() => {
56
+        return Promise.reject(false);
57
+    });
58
+    return expect(c.connect('email', 'password')).rejects.toBe(ERROR_TYPE.SAVE_TOKEN);
59
+});
60
+
61
+test("connect connection error", () => {
62
+    jest.spyOn(global, 'fetch').mockImplementationOnce(() => {
63
+        return Promise.reject();
64
+    });
65
+    return expect(c.connect('email', 'password'))
66
+        .rejects.toBe(ERROR_TYPE.CONNECTION_ERROR);
67
+});
68
+
69
+test("connect bogus response 1", () => {
70
+    jest.spyOn(global, 'fetch').mockImplementationOnce(() => {
71
+        return Promise.resolve({
72
+            json: () => {
73
+                return     {
74
+                    thing: true,
75
+                    wrong: '',
76
+                }
77
+            },
78
+        })
79
+    });
80
+    return expect(c.connect('email', 'password'))
81
+        .rejects.toBe(ERROR_TYPE.CONNECTION_ERROR);
82
+});
83
+
84
+test("connect bogus response 2", () => {
85
+    jest.spyOn(global, 'fetch').mockImplementationOnce(() => {
86
+        return Promise.resolve({
87
+            json: () => {
88
+                return     {
89
+                    state: true,
90
+                    message: '',
91
+                }
92
+            },
93
+        })
94
+    });
95
+    return expect(c.connect('email', 'password'))
96
+        .rejects.toBe(ERROR_TYPE.CONNECTION_ERROR);
97
+});
98
+
99
+test("connect bogus response 3", () => {
100
+    jest.spyOn(global, 'fetch').mockImplementationOnce(() => {
101
+        return Promise.resolve({
102
+            json: () => {
103
+                return     {
104
+                    state: false,
105
+                    message: '',
106
+                }
107
+            },
108
+        })
109
+    });
110
+    return expect(c.connect('email', 'password'))
111
+        .rejects.toBe(ERROR_TYPE.BAD_CREDENTIALS);
112
+});
113
+
114
+test("connect bogus response 4", () => {
115
+    jest.spyOn(global, 'fetch').mockImplementationOnce(() => {
116
+        return Promise.resolve({
117
+            json: () => {
118
+                return     {
119
+                    message: '',
120
+                    token: '',
121
+                }
122
+            },
123
+        })
124
+    });
125
+    return expect(c.connect('email', 'password'))
126
+        .rejects.toBe(ERROR_TYPE.CONNECTION_ERROR);
127
+});
128
+
129
+test("connect bogus response 5", () => {
130
+    jest.spyOn(global, 'fetch').mockImplementationOnce(() => {
131
+        return Promise.resolve({
132
+            json: () => {
133
+                return     {
134
+                    state: true,
135
+                    message: 'Connexion confirmée',
136
+                    token: ''
137
+                }
138
+            },
139
+        })
140
+    });
141
+    return expect(c.connect('email', 'password'))
142
+        .rejects.toBe(ERROR_TYPE.CONNECTION_ERROR);
15 143
 });

+ 35
- 11
managers/ConnectionManager.js View File

@@ -1,8 +1,11 @@
1 1
 // @flow
2 2
 
3
+import * as SecureStore from 'expo-secure-store';
4
+
3 5
 export const ERROR_TYPE = {
4 6
     BAD_CREDENTIALS: 0,
5
-    CONNECTION_ERROR: 1
7
+    CONNECTION_ERROR: 1,
8
+    SAVE_TOKEN: 2,
6 9
 };
7 10
 
8 11
 const AUTH_URL = "https://www.amicale-insat.fr/api/password";
@@ -27,6 +30,20 @@ export default class ConnectionManager {
27 30
             ConnectionManager.instance;
28 31
     }
29 32
 
33
+    async saveLogin(email: string, token: string) {
34
+        this.#token = token;
35
+        this.#email = email;
36
+        return new Promise((resolve, reject) => {
37
+            SecureStore.setItemAsync('token', token)
38
+                .then(() => {
39
+                    resolve(true);
40
+                })
41
+                .catch(error => {
42
+                    reject(false);
43
+                });
44
+        });
45
+    }
46
+
30 47
     async connect(email: string, password: string) {
31 48
         let data = {
32 49
             email: email,
@@ -42,24 +59,31 @@ export default class ConnectionManager {
42 59
                 body: JSON.stringify(data)
43 60
             }).then(async (response) => response.json())
44 61
                 .then((data) => {
45
-                    console.log(data);
46
-                    if (this.isResponseValid(data))
47
-                        resolve({success: data.success, token: data.token});
48
-                    else
49
-                        reject(ERROR_TYPE.BAD_CREDENTIALS);
62
+                    if (this.isResponseValid(data)) {
63
+                        if (data.state) {
64
+                            this.saveLogin(email, data.token)
65
+                                .then(() => {
66
+                                    resolve(true);
67
+                                })
68
+                                .catch(() => {
69
+                                    reject(ERROR_TYPE.SAVE_TOKEN);
70
+                                });
71
+                        } else
72
+                            reject(ERROR_TYPE.BAD_CREDENTIALS);
73
+                    } else
74
+                        reject(ERROR_TYPE.CONNECTION_ERROR);
50 75
                 })
51 76
                 .catch((error) => {
52
-                    console.log(error);
53 77
                     reject(ERROR_TYPE.CONNECTION_ERROR);
54 78
                 });
55 79
         });
56 80
     }
57 81
 
58 82
     isResponseValid(response: Object) {
59
-        return response !== undefined
60
-            && response.success !== undefined
61
-            && response.success
62
-            && response.token !== undefined;
83
+        let valid = response !== undefined && response.state !== undefined;
84
+        if (valid && response.state)
85
+            valid = valid && response.token !== undefined && response.token !== '';
86
+        return valid;
63 87
     }
64 88
 
65 89
 }

+ 3
- 0
package.json View File

@@ -12,6 +12,9 @@
12 12
   },
13 13
   "jest": {
14 14
     "preset": "react-native",
15
+    "transformIgnorePatterns": [
16
+      "node_modules/(?!(jest-)?react-native|react-clone-referenced-element|@react-native-community|expo(nent)?|@expo(nent)?/.*|react-navigation|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base)"
17
+    ],
15 18
     "setupFilesAfterEnv": [
16 19
       "jest-extended"
17 20
     ]

Loading…
Cancel
Save