mtg-playerinfo 1.2.2 → 1.3.1

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,213 @@
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
+ const 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
+ const capturedLogs = []
49
+ const originalLog = console.log
50
+ console.log = (msg) => { capturedLogs.push(msg) }
51
+
52
+ try {
53
+ 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
+ const 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
+ const capturedLogs = []
112
+ const originalLog = console.log
113
+ console.log = (msg) => { capturedLogs.push(msg) }
114
+
115
+ try {
116
+ 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
+ const capturedLogs = []
145
+ const originalLog = console.log
146
+ console.log = (msg) => { capturedLogs.push(msg) }
147
+
148
+ try {
149
+ 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
+ const capturedLogs = []
171
+ const originalLog = console.log
172
+ console.log = (msg) => { capturedLogs.push(msg) }
173
+
174
+ try {
175
+ 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
+ const capturedLogs = []
198
+ const originalLog = console.log
199
+ console.log = (msg) => { capturedLogs.push(msg) }
200
+
201
+ try {
202
+ manager.mergeData(results, true)
203
+ const promotedLogs = capturedLogs.filter(log => log.includes('⬆️'))
204
+ assert.ok(promotedLogs.length >= 5, `Should log 5+ promoted properties, got ${promotedLogs.length}`)
205
+ assert.ok(promotedLogs.some(log => log.includes('name')))
206
+ assert.ok(promotedLogs.some(log => log.includes('team')))
207
+ assert.ok(promotedLogs.some(log => log.includes('bio')))
208
+ assert.ok(promotedLogs.some(log => log.includes('photo')))
209
+ assert.ok(promotedLogs.some(log => log.includes('pronouns')))
210
+ } finally {
211
+ console.log = originalLog
212
+ }
213
+ })