Просмотр исходного кода

Merge branch 'membership-join-test' of fyindr/siimee into dev

tags/0.0.1^2
maeda 3 лет назад
Родитель
Сommit
badaf7da5b

+ 0
- 1
backend/lib/routes/profile/score.js Просмотреть файл

59
                 maxDistanceMiles,
59
                 maxDistanceMiles,
60
                 distanceUnit,
60
                 distanceUnit,
61
             )
61
             )
62
-
63
             try {
62
             try {
64
                 if (!scoredProfiles) {
63
                 if (!scoredProfiles) {
65
                     throw new RangeError('Unable to score profiles')
64
                     throw new RangeError('Unable to score profiles')

+ 0
- 4
backend/lib/services/membership.js Просмотреть файл

116
             profileId,
116
             profileId,
117
             targetId,
117
             targetId,
118
         )
118
         )
119
-
120
         if (matchingGroupingIds.length) {
119
         if (matchingGroupingIds.length) {
121
             /** Grab all memberships associated with groupingIds */
120
             /** Grab all memberships associated with groupingIds */
122
             let memberships = await Membership.query().whereIn(
121
             let memberships = await Membership.query().whereIn(
152
                 membership_type: role,
151
                 membership_type: role,
153
                 can_edit: false,
152
                 can_edit: false,
154
             }
153
             }
155
-
156
             const userMembership = await Membership.query(txn).insert({
154
             const userMembership = await Membership.query(txn).insert({
157
                 profile_id: profileId,
155
                 profile_id: profileId,
158
                 ...membershipDetailsInCommon,
156
                 ...membershipDetailsInCommon,
159
                 is_active: true,
157
                 is_active: true,
160
             })
158
             })
161
-
162
             const targetMembership = await Membership.query(txn).insert({
159
             const targetMembership = await Membership.query(txn).insert({
163
                 profile_id: targetId,
160
                 profile_id: targetId,
164
                 ...membershipDetailsInCommon,
161
                 ...membershipDetailsInCommon,
165
                 is_active: false,
162
                 is_active: false,
166
             })
163
             })
167
-
168
             return {
164
             return {
169
                 memberships: [userMembership, targetMembership],
165
                 memberships: [userMembership, targetMembership],
170
                 groupings: [],
166
                 groupings: [],

+ 7
- 4
backend/lib/services/profile/index.js Просмотреть файл

216
         if (scoring._isScorableResponse(responseToSave.response_key_id)) {
216
         if (scoring._isScorableResponse(responseToSave.response_key_id)) {
217
             // Convert -3 to 0, 0 to 3, 3 to 6
217
             // Convert -3 to 0, 0 to 3, 3 to 6
218
             const offset = (config.scoreVals.length - 1) / 2
218
             const offset = (config.scoreVals.length - 1) / 2
219
-            const indexFromInput = parseInt(responseToSave.val) + offset
220
-            convertedResponse.val = config.scoreVals[indexFromInput].toString()
219
+            const scoreFromInput = parseInt(responseToSave.val) + offset
220
+            const scoreFromConfig = config.scoreVals.indexOf(scoreFromInput)
221
+            if (scoreFromConfig < 0) {
222
+                console.error('score not found in possible config responses')
223
+            }
224
+            convertedResponse.val = scoreFromConfig.toString()
221
         }
225
         }
222
 
226
 
223
         await Response.query().insert(convertedResponse)
227
         await Response.query().insert(convertedResponse)
265
         let profileIdsOfOppositeType = await Profile.query()
269
         let profileIdsOfOppositeType = await Profile.query()
266
             .withGraphFetched('responses')
270
             .withGraphFetched('responses')
267
             .withGraphFetched('user')
271
             .withGraphFetched('user')
268
-
269
         // TODO: Let Objection optimize this
272
         // TODO: Let Objection optimize this
270
         const isPosterOpposite = userProfile.user.is_poster == 1 ? 0 : 1
273
         const isPosterOpposite = userProfile.user.is_poster == 1 ? 0 : 1
271
         profileIdsOfOppositeType = profileIdsOfOppositeType
274
         profileIdsOfOppositeType = profileIdsOfOppositeType
295
                 }
298
                 }
296
             }),
299
             }),
297
         )
300
         )
301
+
298
         const distanceFilteredProfiles = zipcoder.filterByDistance(
302
         const distanceFilteredProfiles = zipcoder.filterByDistance(
299
             profilePlusDistance,
303
             profilePlusDistance,
300
             maxDistance,
304
             maxDistance,
304
             userProfile,
308
             userProfile,
305
             this.scoreLookup,
309
             this.scoreLookup,
306
         )
310
         )
307
-
308
         // Order by score
311
         // Order by score
309
         return scoredProfilesWithDistance.sort(
312
         return scoredProfilesWithDistance.sort(
310
             (a, b) => b.score.total - a.score.total,
313
             (a, b) => b.score.total - a.score.total,

+ 0
- 1
backend/lib/services/profile/scorer.js Просмотреть файл

31
         return {
31
         return {
32
             error: `complete responses for profile: ${seeker.profile_id} unqeual to profile: ${potentialMatch.profile_id} | ${seeker.responses.length}:${potentialMatch.responses.length}`,
32
             error: `complete responses for profile: ${seeker.profile_id} unqeual to profile: ${potentialMatch.profile_id} | ${seeker.responses.length}:${potentialMatch.responses.length}`,
33
         }
33
         }
34
-
35
     const aRes = seeker.responses.filter(res =>
34
     const aRes = seeker.responses.filter(res =>
36
         _isScorableResponse(res.response_key_id),
35
         _isScorableResponse(res.response_key_id),
37
     )
36
     )

+ 8
- 9
backend/tests/matchqueue.spec.js Просмотреть файл

71
     stub(server.models()['AspectLabel'], 'query').returns(mockReturn.labels)
71
     stub(server.models()['AspectLabel'], 'query').returns(mockReturn.labels)
72
     stub(server.models()['Aspect'], 'query').returns(mockReturn.aspects)
72
     stub(server.models()['Aspect'], 'query').returns(mockReturn.aspects)
73
     stub(server.models()['MatchQueue'], 'query').returns({
73
     stub(server.models()['MatchQueue'], 'query').returns({
74
-        // Mocked for markAsDeleted()
75
-        patch: () => ({
76
-            where: () => ({
77
-                andWhere: () => ({
78
-                    first: () => ({ patch: 'bop' }),
79
-                }),
80
-            }),
81
-        }),
82
         insert: queueRecord => {
74
         insert: queueRecord => {
83
             t.is(queueRecord.profile_id, params.profile_id)
75
             t.is(queueRecord.profile_id, params.profile_id)
84
             t.is(queueRecord.target_id, params.target_id)
76
             t.is(queueRecord.target_id, params.target_id)
89
             where: (cmd, val) => {
81
             where: (cmd, val) => {
90
                 return mockReturn.queue
82
                 return mockReturn.queue
91
             },
83
             },
84
+            // Mocked for markAsDeleted()
85
+            andWhere: () => ({
86
+                patch: () => ({
87
+                    first: () => ({
88
+                        patch: 'bop',
89
+                    }),
90
+                }),
91
+            }),
92
         }),
92
         }),
93
     })
93
     })
94
 
94
 
97
      */
97
      */
98
     const { payload } = await server.inject(pathToTest)
98
     const { payload } = await server.inject(pathToTest)
99
     const res = JSON.parse(payload)
99
     const res = JSON.parse(payload)
100
-
101
     t.deepEqual(res.ok, true)
100
     t.deepEqual(res.ok, true)
102
     t.deepEqual(
101
     t.deepEqual(
103
         res.data,
102
         res.data,

+ 97
- 0
backend/tests/membership-join.spec.js Просмотреть файл

1
+'use strict'
2
+
3
+const test = require('ava')
4
+const { stub } = require('sinon')
5
+const Hapi = require('@hapi/hapi')
6
+
7
+const plugin = require('../lib/plugins/membership')
8
+
9
+const Grouping = require('../lib/models/grouping')
10
+const Membership = require('../lib/models/membership')
11
+
12
+const ProfileService = require('../lib/services/profile')
13
+
14
+const params = {
15
+    profile_id: 3,
16
+}
17
+const mockReturn = {
18
+    memberships: [
19
+        {
20
+            membership_id: 4,
21
+            profile_id: 3,
22
+            grouping_id: 3,
23
+            membership_type: 'participant',
24
+            can_edit: false,
25
+            is_active: true,
26
+        },
27
+        {
28
+            membership_id: 5,
29
+            profile_id: 1,
30
+            grouping_id: 3,
31
+            membership_type: 'participant',
32
+            can_edit: false,
33
+            is_active: false,
34
+        },
35
+    ],
36
+    hasMatch: false,
37
+    groupings: [],
38
+}
39
+const pathToTest = {
40
+    method: 'POST',
41
+    url: `/${params.profile_id}/join`,
42
+    payload: {
43
+        grouping_id: 3,
44
+        grouping_name: 'test_match',
45
+        grouping_type: 'test_group',
46
+        target_id: 1,
47
+        role: 'participant',
48
+    },
49
+}
50
+
51
+let membership_id = 4
52
+test(`path ${pathToTest.url} should return two memberships`, async t => {
53
+    const server = Hapi.server()
54
+    server.registerModel = () => {}
55
+    server.models = () => ({
56
+        Grouping,
57
+        Membership,
58
+    })
59
+    await plugin.register(server)
60
+    server.services()['profileService'] = new ProfileService(server)
61
+    /**
62
+     * TODO: adjust stubs to mock joinGrouping more closely
63
+     */
64
+    stub(server.models()['Grouping'], 'query').returns({
65
+        whereIn: () => mockReturn.groupings,
66
+    })
67
+    stub(server.models()['Membership'], 'query').returns({
68
+        where: pid => {
69
+            if (pid == 'membership_id') {
70
+                return {
71
+                    where: () => ({
72
+                        patch: () => {},
73
+                    }),
74
+                }
75
+            }
76
+            return mockReturn.memberships.filter(
77
+                membership => membership.profile_id == pid.profile_id,
78
+            )
79
+        },
80
+        insert: toInsert => {
81
+            const membership = { membership_id, ...toInsert }
82
+            mockReturn.memberships.push(membership)
83
+            membership_id++
84
+            return membership
85
+        },
86
+        whereIn: () => mockReturn.memberships,
87
+    })
88
+
89
+    /**
90
+     * Test the server with registered models and services
91
+     */
92
+    const { payload } = await server.inject(pathToTest)
93
+    const res = JSON.parse(payload)
94
+    t.deepEqual(res.ok, true)
95
+    t.deepEqual(res.data, mockReturn)
96
+    server.stop()
97
+})

+ 2
- 2
backend/tests/respond.spec.js Просмотреть файл

20
             response_id: 1,
20
             response_id: 1,
21
             profile_id: 38,
21
             profile_id: 38,
22
             response_key_id: 6,
22
             response_key_id: 6,
23
-            val: '400',
23
+            val: '2056',
24
         },
24
         },
25
         {
25
         {
26
             response_id: 2,
26
             response_id: 2,
32
 }
32
 }
33
 const pathToTest = {
33
 const pathToTest = {
34
     method: 'POST',
34
     method: 'POST',
35
-    url: `/${params.profile_id}/respond?response_key_id=5&val=999`,
35
+    url: `/${params.profile_id}/respond?response_key_id=5&val=2053`,
36
 }
36
 }
37
 
37
 
38
 test('path /<profile_id>/respond should return ok on POST', async t => {
38
 test('path /<profile_id>/respond should return ok on POST', async t => {

+ 6
- 6
backend/tests/score.spec.js Просмотреть файл

28
             profile_id: 1,
28
             profile_id: 1,
29
             user: { is_poster: 1 },
29
             user: { is_poster: 1 },
30
             responses: [
30
             responses: [
31
-                { val: '100' },
32
-                { val: '200' },
31
+                { response_key_id: 1, val: '100' },
32
+                { response_key_id: 2, val: '200' },
33
                 { response_key_id: zipcodeKey, val: '90065' },
33
                 { response_key_id: zipcodeKey, val: '90065' },
34
             ],
34
             ],
35
         },
35
         },
37
             profile_id: 2,
37
             profile_id: 2,
38
             user: { is_poster: 0 },
38
             user: { is_poster: 0 },
39
             responses: [
39
             responses: [
40
-                { val: '100' },
41
-                { val: '200' },
40
+                { response_key_id: 1, val: '100' },
41
+                { response_key_id: 2, val: '200' },
42
                 { response_key_id: zipcodeKey, val: '97002' },
42
                 { response_key_id: zipcodeKey, val: '97002' },
43
             ],
43
             ],
44
         },
44
         },
46
             profile_id: 3,
46
             profile_id: 3,
47
             user: { is_poster: 0 },
47
             user: { is_poster: 0 },
48
             responses: [
48
             responses: [
49
-                { val: '200' },
50
-                { val: '200' },
49
+                { response_key_id: 1, val: '200' },
50
+                { response_key_id: 2, val: '200' },
51
                 { response_key_id: zipcodeKey, val: '96741' },
51
                 { response_key_id: zipcodeKey, val: '96741' },
52
             ],
52
             ],
53
         },
53
         },

Загрузка…
Отмена
Сохранить