86 lines
2.9 KiB
TypeScript
86 lines
2.9 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
|
|
// Mock the MongoDB connection
|
|
const mockDistinct = vi.fn()
|
|
const mockCollection = {
|
|
distinct: mockDistinct,
|
|
}
|
|
|
|
vi.mock('@adonisjs/core/services/logger', () => ({
|
|
default: { info: vi.fn(), debug: vi.fn(), warn: vi.fn(), error: vi.fn() },
|
|
}))
|
|
|
|
// Mock BaseModel's getDb to return our mock collection
|
|
vi.mock('../../../database/base_model.js', () => ({
|
|
BaseModel: class {
|
|
static collectionName = 'devices'
|
|
static getCollection() { return mockCollection }
|
|
static getDb() { return { collection: () => mockCollection } }
|
|
},
|
|
}))
|
|
|
|
import DeviceModel from '../../../app/models/device.js'
|
|
|
|
describe('DeviceModel.distinctCriteriaValues', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
})
|
|
|
|
it('returns distinct manufacturers, ouis and productClasses', async () => {
|
|
mockDistinct
|
|
.mockResolvedValueOnce(['Sagemcom', 'Huawei'])
|
|
.mockResolvedValueOnce(['F8B7FF', '202BC1'])
|
|
.mockResolvedValueOnce(['Livebox 4', 'BM632w'])
|
|
|
|
const result = await DeviceModel.distinctCriteriaValues()
|
|
|
|
expect(mockDistinct).toHaveBeenCalledTimes(3)
|
|
expect(mockDistinct).toHaveBeenCalledWith('deviceId.manufacturer')
|
|
expect(mockDistinct).toHaveBeenCalledWith('deviceId.oui')
|
|
expect(mockDistinct).toHaveBeenCalledWith('deviceId.productClass')
|
|
|
|
expect(result.manufacturers).toEqual(['Huawei', 'Sagemcom'])
|
|
expect(result.ouis).toEqual(['202BC1', 'F8B7FF'])
|
|
expect(result.productClasses).toEqual(['BM632w', 'Livebox 4'])
|
|
})
|
|
|
|
it('filters out null and non-string values', async () => {
|
|
mockDistinct
|
|
.mockResolvedValueOnce(['Sagemcom', null, undefined, '', 123])
|
|
.mockResolvedValueOnce([null, 'F8B7FF'])
|
|
.mockResolvedValueOnce(['Livebox 4', null])
|
|
|
|
const result = await DeviceModel.distinctCriteriaValues()
|
|
|
|
expect(result.manufacturers).toEqual(['Sagemcom'])
|
|
expect(result.ouis).toEqual(['F8B7FF'])
|
|
expect(result.productClasses).toEqual(['Livebox 4'])
|
|
})
|
|
|
|
it('returns empty arrays when no devices exist', async () => {
|
|
mockDistinct
|
|
.mockResolvedValueOnce([])
|
|
.mockResolvedValueOnce([])
|
|
.mockResolvedValueOnce([])
|
|
|
|
const result = await DeviceModel.distinctCriteriaValues()
|
|
|
|
expect(result.manufacturers).toEqual([])
|
|
expect(result.ouis).toEqual([])
|
|
expect(result.productClasses).toEqual([])
|
|
})
|
|
|
|
it('sorts results alphabetically', async () => {
|
|
mockDistinct
|
|
.mockResolvedValueOnce(['Zyxel', 'Arcadyan', 'Sagemcom'])
|
|
.mockResolvedValueOnce(['FFFFFF', 'AAAAAA', 'CCCCCC'])
|
|
.mockResolvedValueOnce(['Router Z', 'Box A', 'Modem C'])
|
|
|
|
const result = await DeviceModel.distinctCriteriaValues()
|
|
|
|
expect(result.manufacturers).toEqual(['Arcadyan', 'Sagemcom', 'Zyxel'])
|
|
expect(result.ouis).toEqual(['AAAAAA', 'CCCCCC', 'FFFFFF'])
|
|
expect(result.productClasses).toEqual(['Box A', 'Modem C', 'Router Z'])
|
|
})
|
|
})
|