1 | const describe = require('mocha').describe;
|
2 | const assert = require('assert');
|
3 | const GameCtrl = require('../ssb_ctrl/game');
|
4 | const Value = require('mutant/value');
|
5 | const fs = require('fs');
|
6 |
|
7 | const watch = require('mutant/watch');
|
8 |
|
9 | describe('Rematch', function() {
|
10 |
|
11 | const gameId = "%/YqXidBKnATnSkKOZSliEllkRqrdo0csbeF/xt6lR1k=.sha256";
|
12 |
|
13 | const rematchId = "%7Ko0nl87fHFxx3WmWLb2eNwGteSwdqUPYa5ybjtjR5I=.sha256";
|
14 |
|
15 |
|
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 |