ohif-viewer/extensions/cornerstone/src/utils/hydrationUtils.test.ts

308 lines
8.6 KiB
TypeScript

import { getUpdatedViewportsForSegmentation } from './hydrationUtils';
describe('getUpdatedViewportsForSegmentation', () => {
const mockHangingProtocolService = {
getViewportsRequireUpdate: jest.fn(),
};
const mockViewportGridService = {
getState: jest.fn(),
};
const mockServicesManager = {
services: {
hangingProtocolService: mockHangingProtocolService,
viewportGridService: mockViewportGridService,
},
};
const mockViewport = {
viewportOptions: {
viewportId: 'target-viewport-id',
},
};
const mockViewports = new Map([
['viewport-1', mockViewport],
['active-viewport-id', mockViewport],
]);
const defaultParameters = {
viewportId: 'viewport-1',
servicesManager: mockServicesManager as unknown as AppTypes.ServicesManager,
displaySetInstanceUIDs: ['display-set-1'],
};
beforeEach(() => {
jest.clearAllMocks();
mockViewportGridService.getState.mockReturnValue({
isHangingProtocolLayout: true,
viewports: mockViewports,
activeViewportId: 'active-viewport-id',
});
mockHangingProtocolService.getViewportsRequireUpdate.mockReturnValue([]);
});
it('should get updated viewports for segmentation', () => {
const mockUpdatedViewports = [
{
viewportOptions: {
viewportType: 'stack',
},
},
{
viewportOptions: {
viewportType: 'volume',
},
},
];
mockHangingProtocolService.getViewportsRequireUpdate.mockReturnValue(mockUpdatedViewports);
const result = getUpdatedViewportsForSegmentation(defaultParameters);
expect(mockViewportGridService.getState).toHaveBeenCalled();
expect(mockHangingProtocolService.getViewportsRequireUpdate).toHaveBeenCalledWith(
mockViewport.viewportOptions.viewportId,
defaultParameters.displaySetInstanceUIDs[0],
true
);
expect(result).toEqual(mockUpdatedViewports);
});
it('should handle viewports without viewportOptions', () => {
const mockUpdatedViewports = [
{
viewportOptions: {
viewportType: 'stack',
},
},
{
someOtherProperty: 'value',
},
{
viewportOptions: null,
},
];
mockHangingProtocolService.getViewportsRequireUpdate.mockReturnValue(mockUpdatedViewports);
const result = getUpdatedViewportsForSegmentation(defaultParameters);
expect(result).toEqual([
{
viewportOptions: {
viewportType: 'stack',
},
},
{
someOtherProperty: 'value',
},
{
viewportOptions: null,
},
]);
});
it('should use activeViewportId when viewportId is not provided', () => {
const result = getUpdatedViewportsForSegmentation({
...defaultParameters,
viewportId: null,
});
expect(mockHangingProtocolService.getViewportsRequireUpdate).toHaveBeenCalledWith(
mockViewport.viewportOptions.viewportId,
defaultParameters.displaySetInstanceUIDs[0],
true
);
expect(result).toEqual([]);
});
it('should use activeViewportId when viewportId is undefined', () => {
const result = getUpdatedViewportsForSegmentation({
...defaultParameters,
viewportId: undefined,
});
expect(mockHangingProtocolService.getViewportsRequireUpdate).toHaveBeenCalledWith(
mockViewport.viewportOptions.viewportId,
defaultParameters.displaySetInstanceUIDs[0],
true
);
expect(result).toEqual([]);
});
it('should handle isHangingProtocolLayout false', () => {
mockViewportGridService.getState.mockReturnValue({
isHangingProtocolLayout: false,
viewports: mockViewports,
activeViewportId: 'active-viewport-id',
});
const result = getUpdatedViewportsForSegmentation(defaultParameters);
expect(mockHangingProtocolService.getViewportsRequireUpdate).toHaveBeenCalledWith(
mockViewport.viewportOptions.viewportId,
defaultParameters.displaySetInstanceUIDs[0],
false
);
expect(result).toEqual([]);
});
it('should handle multiple displaySetInstanceUIDs by using first one', () => {
const result = getUpdatedViewportsForSegmentation({
...defaultParameters,
displaySetInstanceUIDs: ['display-set-1', 'display-set-2', 'display-set-3'],
});
expect(mockHangingProtocolService.getViewportsRequireUpdate).toHaveBeenCalledWith(
mockViewport.viewportOptions.viewportId,
'display-set-1',
true
);
expect(result).toEqual([]);
});
it('should handle empty displaySetInstanceUIDs array', () => {
const result = getUpdatedViewportsForSegmentation({
...defaultParameters,
displaySetInstanceUIDs: [],
});
expect(mockHangingProtocolService.getViewportsRequireUpdate).toHaveBeenCalledWith(
mockViewport.viewportOptions.viewportId,
undefined,
true
);
expect(result).toEqual([]);
});
it('should handle viewport not found in viewports map', () => {
mockViewportGridService.getState.mockReturnValue({
isHangingProtocolLayout: true,
viewports: new Map(),
activeViewportId: 'non-existent-viewport',
});
expect(() => getUpdatedViewportsForSegmentation(defaultParameters)).toThrow();
});
it('should handle viewport with missing viewportOptions', () => {
const viewportWithoutOptions = {};
const viewportsMap = new Map([['viewport-1', viewportWithoutOptions]]);
mockViewportGridService.getState.mockReturnValue({
isHangingProtocolLayout: true,
viewports: viewportsMap,
activeViewportId: 'active-viewport-id',
});
expect(() => getUpdatedViewportsForSegmentation(defaultParameters)).toThrow();
});
it('should handle viewport with null viewportOptions', () => {
const viewportWithNullOptions = {
viewportOptions: null,
};
const viewportsMap = new Map([['viewport-1', viewportWithNullOptions]]);
mockViewportGridService.getState.mockReturnValue({
isHangingProtocolLayout: true,
viewports: viewportsMap,
activeViewportId: 'active-viewport-id',
});
expect(() => getUpdatedViewportsForSegmentation(defaultParameters)).toThrow();
});
it('should handle getViewportsRequireUpdate returning null', () => {
mockHangingProtocolService.getViewportsRequireUpdate.mockReturnValue(null);
expect(getUpdatedViewportsForSegmentation(defaultParameters)).toEqual(null);
});
it('should handle mixed viewport types including volume3d', () => {
const mockUpdatedViewports = [
{ viewportOptions: { viewportType: 'stack' } },
{ viewportOptions: { viewportType: 'volume3d' } },
{ viewportOptions: { viewportType: 'volume3d' } },
{ viewportOptions: { viewportType: 'orthogonal' } },
];
mockHangingProtocolService.getViewportsRequireUpdate.mockReturnValue(mockUpdatedViewports);
const result = getUpdatedViewportsForSegmentation(defaultParameters);
expect(result).toEqual(mockUpdatedViewports);
});
it('should handle viewports with undefined viewportType', () => {
const mockUpdatedViewports = [
{
viewportOptions: {
viewportType: undefined,
},
},
{
viewportOptions: {
viewportType: 'volume3d',
},
},
{
viewportOptions: {
someOtherProperty: 'value',
},
},
];
mockHangingProtocolService.getViewportsRequireUpdate.mockReturnValue(mockUpdatedViewports);
const result = getUpdatedViewportsForSegmentation(defaultParameters);
expect(result).toEqual(mockUpdatedViewports);
});
it('should handle complex viewport structure', () => {
const complexViewport = {
viewportOptions: {
viewportId: 'complex-viewport-id',
viewportType: 'stack',
orientation: 'axial',
initialImageOptions: {
index: 0,
},
},
displaySetOptions: {
displaySetInstanceUID: 'display-set-1',
},
};
const viewportsMap = new Map([['viewport-1', complexViewport]]);
mockViewportGridService.getState.mockReturnValue({
isHangingProtocolLayout: true,
viewports: viewportsMap,
activeViewportId: 'active-viewport-id',
});
const mockUpdatedViewports = [
{
viewportOptions: {
viewportType: 'stack',
},
},
];
mockHangingProtocolService.getViewportsRequireUpdate.mockReturnValue(mockUpdatedViewports);
const result = getUpdatedViewportsForSegmentation(defaultParameters);
expect(mockHangingProtocolService.getViewportsRequireUpdate).toHaveBeenCalledWith(
'complex-viewport-id',
defaultParameters.displaySetInstanceUIDs[0],
true
);
expect(result).toEqual(mockUpdatedViewports);
});
});