Reported: the warranty page cannot be searched by machine number. It was there to be found. _related_machine puts the machine's number in the payload, and it does so for a stated reason - a shopfloor PC is bought, warranted and replaced as a PC, but it is FOUND by the machine it drives, and nobody walks the floor looking for an asset number. The table renders it as a chip. The filter looked at vendor, service level, service tag and asset number, and never at the machine. So the one identifier the feature was designed around was the one thing the search box could not match. This is how a field list goes wrong: a column was added to the table and not to the filter, and nothing connects the two. Moved the field list into warrantySearch.js so a test can see it, following controllingPc.js and labelPages.js. Machine name is searched as well - somebody who knows the bay by "the Makino" should not have to look up its number to find its warranty. The specs also pin the case that made the old inline version fragile: a covered asset whose machine is null, which is every printer and any PC nobody has linked yet, must not throw. And a missing field must not match: String(undefined) is 'undefined', so a naive coercion makes a search for "und" hit every row with an empty vendor. Not changed, worth knowing: the covered asset's NAME is still not searched, only its number. That looks like the same omission, but it is a wider change than the report - the placeholder has always said "asset" without saying which half - so it is left for a deliberate decision rather than folded in here.
80 lines
2.9 KiB
JavaScript
80 lines
2.9 KiB
JavaScript
import { describe, it, expect } from 'vitest'
|
|
|
|
import { matchesWarrantySearch } from './warrantySearch'
|
|
|
|
// Reported: the warranty page could not be searched by machine number.
|
|
//
|
|
// The number was in the payload (_related_machine puts it there) and rendered
|
|
// in the table as a chip, but the filter looked only at vendor, service level,
|
|
// service tag and asset number. So the identifier the feature was built around
|
|
// - a PC is warranted as a PC but FOUND by the machine it drives - was the one
|
|
// thing the box could not find.
|
|
|
|
function warranty(overrides = {}) {
|
|
return {
|
|
vendor: 'Dell',
|
|
servicelevel: 'ProSupport',
|
|
servicetag: 'ABC1234',
|
|
assets: [{
|
|
assetnumber: 'PC-00912',
|
|
name: 'Bay 3105 workstation',
|
|
machine: { machinenumber: '3016', name: 'Makino a61nx' },
|
|
}],
|
|
...overrides,
|
|
}
|
|
}
|
|
|
|
describe('matchesWarrantySearch', () => {
|
|
it('matches on the machine number', () => {
|
|
// The reported case.
|
|
expect(matchesWarrantySearch(warranty(), '3016')).toBe(true)
|
|
})
|
|
|
|
it('matches on the machine name', () => {
|
|
expect(matchesWarrantySearch(warranty(), 'makino')).toBe(true)
|
|
})
|
|
|
|
it('still matches the fields it always did', () => {
|
|
expect(matchesWarrantySearch(warranty(), 'dell')).toBe(true)
|
|
expect(matchesWarrantySearch(warranty(), 'prosupport')).toBe(true)
|
|
expect(matchesWarrantySearch(warranty(), 'abc1234')).toBe(true)
|
|
expect(matchesWarrantySearch(warranty(), 'pc-00912')).toBe(true)
|
|
})
|
|
|
|
it('is case insensitive and ignores surrounding space', () => {
|
|
expect(matchesWarrantySearch(warranty(), ' MAKINO ')).toBe(true)
|
|
})
|
|
|
|
it('does not match an unrelated term', () => {
|
|
expect(matchesWarrantySearch(warranty(), '9999')).toBe(false)
|
|
})
|
|
|
|
it('keeps every row when the term is empty', () => {
|
|
expect(matchesWarrantySearch(warranty(), '')).toBe(true)
|
|
expect(matchesWarrantySearch(warranty(), ' ')).toBe(true)
|
|
expect(matchesWarrantySearch(warranty(), undefined)).toBe(true)
|
|
})
|
|
|
|
it('handles a warranty whose asset drives no machine', () => {
|
|
// machine is null whenever the covered asset has no controls link - a
|
|
// printer, or a PC nobody linked yet. It must not throw.
|
|
const row = warranty({ assets: [{ assetnumber: 'PR-42', machine: null }] })
|
|
expect(matchesWarrantySearch(row, 'PR-42')).toBe(true)
|
|
expect(matchesWarrantySearch(row, '3016')).toBe(false)
|
|
})
|
|
|
|
it('handles a warranty with no linked assets at all', () => {
|
|
const row = warranty({ assets: [] })
|
|
expect(matchesWarrantySearch(row, 'dell')).toBe(true)
|
|
expect(matchesWarrantySearch(row, '3016')).toBe(false)
|
|
})
|
|
|
|
it('tolerates missing fields rather than matching everything', () => {
|
|
// String(undefined) is 'undefined', which would make a search for 'und'
|
|
// match every row with an empty field.
|
|
const row = { vendor: null, servicelevel: undefined, assets: null }
|
|
expect(matchesWarrantySearch(row, 'und')).toBe(false)
|
|
expect(matchesWarrantySearch(row, 'null')).toBe(false)
|
|
})
|
|
})
|