232 lines
7.3 KiB
TypeScript
232 lines
7.3 KiB
TypeScript
/*
|
|
* File: aiPredictionSlice.test.ts
|
|
* Description: Unit tests for AI Prediction Redux slice
|
|
* Design & Developed by Tech4Biz Solutions
|
|
* Copyright (c) Spurrin Innovations. All rights reserved.
|
|
*/
|
|
|
|
import aiPredictionReducer, {
|
|
setSearchQuery,
|
|
setUrgencyFilter,
|
|
setSeverityFilter,
|
|
setCategoryFilter,
|
|
clearAllFilters,
|
|
toggleShowFilters,
|
|
clearError,
|
|
} from '../redux/aiPredictionSlice';
|
|
import type { AIPredictionState } from '../types';
|
|
|
|
// ============================================================================
|
|
// MOCK DATA
|
|
// ============================================================================
|
|
|
|
const initialState: AIPredictionState = {
|
|
predictionCases: [],
|
|
currentCase: null,
|
|
isLoading: false,
|
|
isRefreshing: false,
|
|
isLoadingCaseDetails: false,
|
|
error: null,
|
|
searchQuery: '',
|
|
selectedUrgencyFilter: 'all',
|
|
selectedSeverityFilter: 'all',
|
|
selectedCategoryFilter: 'all',
|
|
sortBy: 'date',
|
|
sortOrder: 'desc',
|
|
currentPage: 1,
|
|
itemsPerPage: 20,
|
|
totalItems: 0,
|
|
lastUpdated: null,
|
|
cacheExpiry: null,
|
|
showFilters: false,
|
|
selectedCaseIds: [],
|
|
};
|
|
|
|
// ============================================================================
|
|
// UNIT TESTS
|
|
// ============================================================================
|
|
|
|
describe('AI Prediction Slice', () => {
|
|
// ============================================================================
|
|
// INITIAL STATE TESTS
|
|
// ============================================================================
|
|
|
|
it('should return the initial state', () => {
|
|
const result = aiPredictionReducer(undefined, { type: 'unknown' });
|
|
expect(result).toEqual(initialState);
|
|
});
|
|
|
|
// ============================================================================
|
|
// SEARCH TESTS
|
|
// ============================================================================
|
|
|
|
describe('Search functionality', () => {
|
|
it('should handle setSearchQuery', () => {
|
|
const searchQuery = 'test search';
|
|
const action = setSearchQuery(searchQuery);
|
|
const result = aiPredictionReducer(initialState, action);
|
|
|
|
expect(result.searchQuery).toBe(searchQuery);
|
|
expect(result.currentPage).toBe(1); // Should reset to first page
|
|
});
|
|
|
|
it('should handle empty search query', () => {
|
|
const state = { ...initialState, searchQuery: 'existing search' };
|
|
const action = setSearchQuery('');
|
|
const result = aiPredictionReducer(state, action);
|
|
|
|
expect(result.searchQuery).toBe('');
|
|
expect(result.currentPage).toBe(1);
|
|
});
|
|
});
|
|
|
|
// ============================================================================
|
|
// FILTER TESTS
|
|
// ============================================================================
|
|
|
|
describe('Filter functionality', () => {
|
|
it('should handle setUrgencyFilter', () => {
|
|
const filter = 'urgent';
|
|
const action = setUrgencyFilter(filter);
|
|
const result = aiPredictionReducer(initialState, action);
|
|
|
|
expect(result.selectedUrgencyFilter).toBe(filter);
|
|
expect(result.currentPage).toBe(1); // Should reset to first page
|
|
});
|
|
|
|
it('should handle setSeverityFilter', () => {
|
|
const filter = 'high';
|
|
const action = setSeverityFilter(filter);
|
|
const result = aiPredictionReducer(initialState, action);
|
|
|
|
expect(result.selectedSeverityFilter).toBe(filter);
|
|
expect(result.currentPage).toBe(1);
|
|
});
|
|
|
|
it('should handle setCategoryFilter', () => {
|
|
const filter = 'critical';
|
|
const action = setCategoryFilter(filter);
|
|
const result = aiPredictionReducer(initialState, action);
|
|
|
|
expect(result.selectedCategoryFilter).toBe(filter);
|
|
expect(result.currentPage).toBe(1);
|
|
});
|
|
|
|
it('should handle clearAllFilters', () => {
|
|
const state: AIPredictionState = {
|
|
...initialState,
|
|
searchQuery: 'test',
|
|
selectedUrgencyFilter: 'urgent',
|
|
selectedSeverityFilter: 'high',
|
|
selectedCategoryFilter: 'critical',
|
|
currentPage: 3,
|
|
};
|
|
|
|
const action = clearAllFilters();
|
|
const result = aiPredictionReducer(state, action);
|
|
|
|
expect(result.searchQuery).toBe('');
|
|
expect(result.selectedUrgencyFilter).toBe('all');
|
|
expect(result.selectedSeverityFilter).toBe('all');
|
|
expect(result.selectedCategoryFilter).toBe('all');
|
|
expect(result.currentPage).toBe(1);
|
|
});
|
|
});
|
|
|
|
// ============================================================================
|
|
// UI STATE TESTS
|
|
// ============================================================================
|
|
|
|
describe('UI state functionality', () => {
|
|
it('should handle toggleShowFilters', () => {
|
|
const action = toggleShowFilters();
|
|
|
|
// Toggle from false to true
|
|
const result1 = aiPredictionReducer(initialState, action);
|
|
expect(result1.showFilters).toBe(true);
|
|
|
|
// Toggle from true to false
|
|
const result2 = aiPredictionReducer(result1, action);
|
|
expect(result2.showFilters).toBe(false);
|
|
});
|
|
|
|
it('should handle clearError', () => {
|
|
const state = { ...initialState, error: 'Test error' };
|
|
const action = clearError();
|
|
const result = aiPredictionReducer(state, action);
|
|
|
|
expect(result.error).toBe(null);
|
|
});
|
|
});
|
|
|
|
// ============================================================================
|
|
// ASYNC ACTION TESTS
|
|
// ============================================================================
|
|
|
|
describe('Async actions', () => {
|
|
it('should handle fetchAIPredictions.pending', () => {
|
|
const action = { type: 'aiPrediction/fetchAIPredictions/pending' };
|
|
const result = aiPredictionReducer(initialState, action);
|
|
|
|
expect(result.isLoading).toBe(true);
|
|
expect(result.error).toBe(null);
|
|
});
|
|
|
|
it('should handle fetchAIPredictions.fulfilled', () => {
|
|
const mockCases = [
|
|
{
|
|
patid: 'test-001',
|
|
hospital_id: 'hospital-001',
|
|
prediction: {
|
|
label: 'test finding',
|
|
finding_type: 'pathology' as const,
|
|
clinical_urgency: 'urgent' as const,
|
|
confidence_score: 0.95,
|
|
finding_category: 'abnormal' as const,
|
|
primary_severity: 'high' as const,
|
|
anatomical_location: 'brain',
|
|
},
|
|
},
|
|
];
|
|
|
|
const action = {
|
|
type: 'aiPrediction/fetchAIPredictions/fulfilled',
|
|
payload: {
|
|
cases: mockCases,
|
|
total: 1,
|
|
page: 1,
|
|
limit: 20,
|
|
},
|
|
};
|
|
|
|
const result = aiPredictionReducer(initialState, action);
|
|
|
|
expect(result.isLoading).toBe(false);
|
|
expect(result.predictionCases).toEqual(mockCases);
|
|
expect(result.totalItems).toBe(1);
|
|
expect(result.error).toBe(null);
|
|
expect(result.lastUpdated).toBeInstanceOf(Date);
|
|
expect(result.cacheExpiry).toBeInstanceOf(Date);
|
|
});
|
|
|
|
it('should handle fetchAIPredictions.rejected', () => {
|
|
const errorMessage = 'Failed to fetch predictions';
|
|
const action = {
|
|
type: 'aiPrediction/fetchAIPredictions/rejected',
|
|
payload: errorMessage,
|
|
};
|
|
|
|
const result = aiPredictionReducer(initialState, action);
|
|
|
|
expect(result.isLoading).toBe(false);
|
|
expect(result.error).toBe(errorMessage);
|
|
});
|
|
});
|
|
});
|
|
|
|
/*
|
|
* End of File: aiPredictionSlice.test.ts
|
|
* Design & Developed by Tech4Biz Solutions
|
|
* Copyright (c) Spurrin Innovations. All rights reserved.
|
|
*/
|