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.
- package/.github/workflows/update-test-data.yml +2 -2
- package/README.md +5 -4
- package/cli.js +5 -3
- package/package.json +1 -1
- package/scripts/update-test-data.js +2 -1
- package/src/fetchers/untapped.js +54 -0
- package/src/index.js +7 -4
- package/test/data/melee.html +50 -35
- package/test/data/topdeck.html +2 -2
- package/test/data/topdeck.json +1 -1
- package/test/data/unityLeague.html +94 -24
- package/test/data/untapped.json +104 -0
- package/test/edgeCases.test.js +128 -0
- package/test/meleeEdgeCases.test.js +53 -0
- package/test/mtgEloEdgeCases.test.js +92 -0
- package/test/{integration/playerInfoManager.test.js → playerInfoManager.test.js} +2 -2
- package/test/unityLeagueEdgeCases.test.js +123 -0
- package/test/untapped.test.js +58 -0
- package/test/verboseLogging.test.js +215 -0
|
@@ -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
|
+
|