UNPKG

6.75 kBJavaScriptView Raw
1const describe = require('mocha').describe;
2const assert = require('assert');
3const GameCtrl = require('../ssb_ctrl/game');
4const Value = require('mutant/value');
5const fs = require('fs');
6
7const watch = require('mutant/watch');
8
9describe('Rematch', function() {
10
11 const gameId = "%/YqXidBKnATnSkKOZSliEllkRqrdo0csbeF/xt6lR1k=.sha256";
12
13 const rematchId = "%7Ko0nl87fHFxx3WmWLb2eNwGteSwdqUPYa5ybjtjR5I=.sha256";
14
15 // I'll look at what mocking frameworks are available on javascript later ;x
16
17 var sbotMock = {
18
19 get: (id, cb) => {
20
21 if (id === gameId) {
22 var inviteMessage = {
23 "previous": "%ZtkVfWMVG7RbLSJ8p6FtNBw/lMlcnC9nNlqTnPeRjNk=.sha256",
24 "sequence": 15456,
25 "author": "@RJ09Kfs3neEZPrbpbWVDxkN92x9moe3aPusOMOc4S2I=.ed25519",
26 "timestamp": 1550602607768,
27 "hash": "sha256",
28 "content": {
29 "type": "chess_invite",
30 "inviting": "@HEqy940T6uB+T+d9Jaa58aNfRzLx9eRWqkZljBmnkmk=.ed25519",
31 "myColor": "black",
32 "branch": [
33 "%eu3NXmX+3W5oIoQRVidittVlDuFfNd3O7lUn/+Duwtk=.sha256",
34 "%1F8Wm55Hvw070OARbmy3rgODqaOFI+izMCQuwuhz0ro=.sha256",
35 "%X/aaewdjTeRjzw7OMpKmcng5/eLlbU25p/uUjUOYCSs=.sha256",
36 "%seGaypHi2RH3YY0zwLnbOU3+CfFesp0Y290iwGz46MU=.sha256",
37 "%9oK3ltfnvH9/7h5sxD6Cu+IYoSXcOddTMPJ5L6dLsUM=.sha256",
38 "%Adu40jiwOvGUXyZqefzsm8Qxd7TGOObH4NuiQNjqC2I=.sha256"
39 ]
40 },
41 "signature": "jNhizxfIy70uflwEFvjjliSNi/6RH5UXpNXwWfi6sfBAjO5AKVteN+Tfybvn9TmKNXsiA8HKiuWHA94TjXIpBw==.sig.ed25519"
42 };
43
44 cb(null, inviteMessage);
45 } else if (id === rematchId) {
46
47 var rematchInvite = {
48 "previous": "%ZtkVfWMVG7RbLSJ8p6FtNBw/lMlcnC9nNlqTnPeRjNk=.sha256",
49 "sequence": 15456,
50 "author": "@RJ09Kfs3neEZPrbpbWVDxkN92x9moe3aPusOMOc4S2I=.ed25519",
51 "timestamp": 1550602607768,
52 "hash": "sha256",
53 "content": {
54 "type": "chess_invite",
55 "root": gameId,
56 "inviting": "@HEqy940T6uB+T+d9Jaa58aNfRzLx9eRWqkZljBmnkmk=.ed25519",
57 "myColor": "black",
58 "branch": [
59 "%eu3NXmX+3W5oIoQRVidittVlDuFfNd3O7lUn/+Duwtk=.sha256",
60 "%1F8Wm55Hvw070OARbmy3rgODqaOFI+izMCQuwuhz0ro=.sha256",
61 "%X/aaewdjTeRjzw7OMpKmcng5/eLlbU25p/uUjUOYCSs=.sha256",
62 "%seGaypHi2RH3YY0zwLnbOU3+CfFesp0Y290iwGz46MU=.sha256",
63 "%9oK3ltfnvH9/7h5sxD6Cu+IYoSXcOddTMPJ5L6dLsUM=.sha256",
64 "%Adu40jiwOvGUXyZqefzsm8Qxd7TGOObH4NuiQNjqC2I=.sha256"
65 ]
66 },
67 "signature": "jNhizxfIy70uflwEFvjjliSNi/6RH5UXpNXwWfi6sfBAjO5AKVteN+Tfybvn9TmKNXsiA8HKiuWHA94TjXIpBw==.sig.ed25519"
68 }
69
70 cb(null, rematchInvite);
71 }
72 else {
73 throw new Error("Unexpected input to sbot get 'mock' " + id);
74 }
75
76 }
77
78 };
79
80 var backlinkUtilsMock = function(isAccepted) {
81 return {
82 getFilteredBackLinks: (id, opts) => {
83 if (id === gameId) {
84
85 var contents = fs.readFileSync(__dirname + '/resources/rematch_offered_backlinks.json');
86 var backlinks = JSON.parse(contents);
87
88 var result = Value();
89 result.set(backlinks);
90
91 result.sync = Value();
92 result.sync.set(true);
93
94 return result;
95 } else if (id === rematchId) {
96
97 var file = isAccepted ? "/resources/rematch_offer_accepted.json" : "/resources/rematch_offered.json";
98 var contents = fs.readFileSync(__dirname + file);
99 var backlinks = JSON.parse(contents);
100
101 var result = Value(backlinks);
102 result.sync = Value();
103 result.sync.set(true);
104
105 return result;
106 } else {
107 throw new Error("Unepexted input to getFilteredBacklinks 'mock' " + id);
108 }
109 }
110 }
111 };
112
113 var socialCtrlMock = {
114
115 getDisplayName: (id) => {
116
117 if (id === "@RJ09Kfs3neEZPrbpbWVDxkN92x9moe3aPusOMOc4S2I=.ed25519") {
118 return Promise.resolve("Rodge");
119 } else if (id === "@HEqy940T6uB+T+d9Jaa58aNfRzLx9eRWqkZljBmnkmk=.ed25519") {
120 return Promise.resolve("Hecky");
121 } else {
122 throw new Error("getDisplayName mock unexpected input: " + id);
123 }
124
125 }
126
127 };
128
129 const myIdent = "@RJ09Kfs3neEZPrbpbWVDxkN92x9moe3aPusOMOc4S2I=.ed25519";
130
131 describe('#offered', function() {
132
133 it("Should detect an offered rematch from current user", function(done) {
134 const gameCtrl = GameCtrl(sbotMock, myIdent, backlinkUtilsMock(false), socialCtrlMock);
135 var situation = gameCtrl.getSituationObservable(gameId);
136
137 watch(situation, state => {
138
139 if (!state || (state.rematches.length > 0 && state.rematches[0].status === "pending" )) return;
140
141 assert.equal(1, state.rematches.length);
142 assert.equal(rematchId, state.rematches[0].gameId);
143 assert.equal("invited", state.rematches[0].status);
144 assert.equal(true, state.rematches[0].isMyInvite);
145
146 done();
147
148 });
149
150 });
151
152 });
153
154 describe('#accepted', function() {
155 it("Should detect an offered rematch has been accepted", function(done) {
156 const gameCtrl = GameCtrl(sbotMock, myIdent, backlinkUtilsMock(true), socialCtrlMock);
157 var situation = gameCtrl.getSituationObservable(gameId);
158
159 watch(situation, state => {
160
161 if (!state || (state.rematches.length > 0 && state.rematches[0].status === "pending" )) return;
162
163 assert.equal(1, state.rematches.length);
164 assert.equal(rematchId, state.rematches[0].gameId);
165 assert.equal("accepted", state.rematches[0].status);
166 assert.equal(true, state.rematches[0].isMyInvite);
167
168 done();
169
170 });
171 });
172 })
173});
\No newline at end of file