mtg-playerinfo 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,215 @@
1
+ const test = require('node:test')
2
+ const assert = require('node:assert/strict')
3
+ const PlayerInfoManager = require('../src')
4
+
5
+ test('PlayerInfoManager: verbose mode logs promoted properties', async () => {
6
+ const manager = new PlayerInfoManager()
7
+
8
+ const results = [
9
+ {
10
+ source: 'Source1',
11
+ url: 'http://source1.com',
12
+ name: 'Player Name'
13
+ }
14
+ ]
15
+
16
+ let capturedLogs = []
17
+ const originalLog = console.log
18
+ console.log = (msg) => { capturedLogs.push(msg) }
19
+
20
+ try {
21
+ const merged = manager.mergeData(results, true)
22
+ assert.equal(merged.general.name, 'Player Name')
23
+ assert.ok(capturedLogs.some(log => log.includes('⬆️') && log.includes('name') && log.includes('Source1')),
24
+ 'Should log property promotion with ⬆️ emoji')
25
+ } finally {
26
+ console.log = originalLog
27
+ }
28
+ })
29
+
30
+ test('PlayerInfoManager: verbose mode logs matching property values', async () => {
31
+ const manager = new PlayerInfoManager()
32
+
33
+ const results = [
34
+ {
35
+ source: 'Source1',
36
+ url: 'http://source1.com',
37
+ name: 'Player Name',
38
+ team: 'Team A'
39
+ },
40
+ {
41
+ source: 'Source2',
42
+ url: 'http://source2.com',
43
+ name: 'Player Name',
44
+ team: 'Team A'
45
+ }
46
+ ]
47
+
48
+ let capturedLogs = []
49
+ const originalLog = console.log
50
+ console.log = (msg) => { capturedLogs.push(msg) }
51
+
52
+ try {
53
+ const merged = manager.mergeData(results, true)
54
+ assert.ok(capturedLogs.some(log => log.includes('🆗') && log.includes('name') && log.includes('Source2')),
55
+ 'Should log matching property with 🆗 emoji')
56
+ assert.ok(capturedLogs.some(log => log.includes('🆗') && log.includes('team') && log.includes('Source2')),
57
+ 'Should log matching team property with 🆗 emoji')
58
+ } finally {
59
+ console.log = originalLog
60
+ }
61
+ })
62
+
63
+ test('PlayerInfoManager: verbose mode logs conflicting property values', async () => {
64
+ const manager = new PlayerInfoManager()
65
+
66
+ const results = [
67
+ {
68
+ source: 'Source1',
69
+ url: 'http://source1.com',
70
+ name: 'Alice'
71
+ },
72
+ {
73
+ source: 'Source2',
74
+ url: 'http://source2.com',
75
+ name: 'Bob'
76
+ }
77
+ ]
78
+
79
+ let capturedLogs = []
80
+ const originalLog = console.log
81
+ console.log = (msg) => { capturedLogs.push(msg) }
82
+
83
+ try {
84
+ const merged = manager.mergeData(results, true)
85
+ assert.equal(merged.general.name, 'Alice', 'Should keep first value')
86
+ assert.ok(capturedLogs.some(log => log.includes('🆚') && log.includes('name') && log.includes('Source2') && log.includes('Bob') && log.includes('Alice')),
87
+ 'Should log conflicting property with 🆚 emoji')
88
+ } finally {
89
+ console.log = originalLog
90
+ }
91
+ })
92
+
93
+ test('PlayerInfoManager: verbose mode uses photo emoji for photo conflicts', async () => {
94
+ const manager = new PlayerInfoManager()
95
+
96
+ const results = [
97
+ {
98
+ source: 'Source1',
99
+ url: 'http://source1.com',
100
+ name: 'Player',
101
+ photo: 'http://photo1.jpg'
102
+ },
103
+ {
104
+ source: 'Source2',
105
+ url: 'http://source2.com',
106
+ name: 'Player',
107
+ photo: 'http://photo2.jpg'
108
+ }
109
+ ]
110
+
111
+ let capturedLogs = []
112
+ const originalLog = console.log
113
+ console.log = (msg) => { capturedLogs.push(msg) }
114
+
115
+ try {
116
+ const merged = manager.mergeData(results, true)
117
+ assert.ok(capturedLogs.some(log => log.includes('🆕') && log.includes('photo')),
118
+ 'Should log photo conflict with 🆕 emoji instead of 🆚')
119
+ } finally {
120
+ console.log = originalLog
121
+ }
122
+ })
123
+
124
+ test('PlayerInfoManager: verbose mode logs with null/undefined properties', async () => {
125
+ const manager = new PlayerInfoManager()
126
+
127
+ const results = [
128
+ {
129
+ source: 'Source1',
130
+ url: 'http://source1.com',
131
+ name: 'Player',
132
+ bio: null,
133
+ team: undefined
134
+ },
135
+ {
136
+ source: 'Source2',
137
+ url: 'http://source2.com',
138
+ name: 'Player',
139
+ bio: 'Test bio',
140
+ team: 'Team A'
141
+ }
142
+ ]
143
+
144
+ let capturedLogs = []
145
+ const originalLog = console.log
146
+ console.log = (msg) => { capturedLogs.push(msg) }
147
+
148
+ try {
149
+ const merged = manager.mergeData(results, true)
150
+ assert.ok(capturedLogs.some(log => log.includes('⬆️') && log.includes('bio') && log.includes('Source2')),
151
+ 'Should promote bio from Source2 after Source1 had null')
152
+ assert.ok(capturedLogs.some(log => log.includes('⬆️') && log.includes('team') && log.includes('Source2')),
153
+ 'Should promote team from Source2 after Source1 had undefined')
154
+ } finally {
155
+ console.log = originalLog
156
+ }
157
+ })
158
+
159
+ test('PlayerInfoManager: verbose mode is false by default and logs nothing', async () => {
160
+ const manager = new PlayerInfoManager()
161
+
162
+ const results = [
163
+ {
164
+ source: 'Source1',
165
+ url: 'http://source1.com',
166
+ name: 'Player Name'
167
+ }
168
+ ]
169
+
170
+ let capturedLogs = []
171
+ const originalLog = console.log
172
+ console.log = (msg) => { capturedLogs.push(msg) }
173
+
174
+ try {
175
+ const merged = manager.mergeData(results, false)
176
+ assert.equal(capturedLogs.length, 0, 'Should not log when verbose is false')
177
+ } finally {
178
+ console.log = originalLog
179
+ }
180
+ })
181
+
182
+ test('PlayerInfoManager: verbose mode logs each property separately', async () => {
183
+ const manager = new PlayerInfoManager()
184
+
185
+ const results = [
186
+ {
187
+ source: 'Source1',
188
+ url: 'http://source1.com',
189
+ name: 'Alice',
190
+ team: 'Team A',
191
+ bio: 'Bio 1',
192
+ photo: 'photo1.jpg',
193
+ pronouns: 'they/them'
194
+ }
195
+ ]
196
+
197
+ let capturedLogs = []
198
+ const originalLog = console.log
199
+ console.log = (msg) => { capturedLogs.push(msg) }
200
+
201
+ try {
202
+ const merged = manager.mergeData(results, true)
203
+ // Should have multiple promoted property logs
204
+ const promotedLogs = capturedLogs.filter(log => log.includes('⬆️'))
205
+ assert.ok(promotedLogs.length >= 5, `Should log 5+ promoted properties, got ${promotedLogs.length}`)
206
+ assert.ok(promotedLogs.some(log => log.includes('name')))
207
+ assert.ok(promotedLogs.some(log => log.includes('team')))
208
+ assert.ok(promotedLogs.some(log => log.includes('bio')))
209
+ assert.ok(promotedLogs.some(log => log.includes('photo')))
210
+ assert.ok(promotedLogs.some(log => log.includes('pronouns')))
211
+ } finally {
212
+ console.log = originalLog
213
+ }
214
+ })
215
+
@@ -0,0 +1,25 @@
1
+ const test = require('node:test')
2
+ const assert = require('node:assert/strict')
3
+ const PlayerInfoManager = require('../src')
4
+
5
+ test('PlayerInfoManager: Win rate should be calculated from total of source W-L-D records', async () => {
6
+ const manager = new PlayerInfoManager()
7
+
8
+ const results = [
9
+ {
10
+ source: 'Source1',
11
+ url: 'url1',
12
+ record: '10-0-0',
13
+ 'win rate': '100.00%'
14
+ },
15
+ {
16
+ source: 'Source2',
17
+ url: 'url2',
18
+ record: '0-90-10',
19
+ 'win rate': '0.00%'
20
+ }
21
+ ]
22
+
23
+ const merged = manager.mergeData(results)
24
+ assert.strictEqual(merged.general['win rate'], '9.09%', 'Win rate should be calculated from total records')
25
+ })
@@ -1,27 +0,0 @@
1
- name: Pull Player Data
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- workflow_dispatch:
8
-
9
- jobs:
10
- run-tool:
11
- runs-on: ubuntu-latest
12
- steps:
13
- - name: Checkout repository
14
- uses: actions/checkout@v4
15
-
16
- - name: Setup Node.js
17
- uses: actions/setup-node@v4
18
- with:
19
- node-version: '24'
20
- cache: 'npm'
21
-
22
- - name: Install dependencies
23
- run: npm install
24
-
25
- - name: Run MTG Player Info Tool for sample player
26
- run: node cli.js --unity-id 16215 --mtgelo-id 3irvwtmk --melee-user k0shiii --topdeck-handle k0shiii
27
-