mtg-playerinfo 1.2.2 → 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
+