308 lines
8.6 KiB
TypeScript
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);
|
|
});
|
|
});
|