added messages list, new client form, logic for client Apps plus others
This commit is contained in:
@@ -0,0 +1,382 @@
|
||||
import Module from '../../../src/js/core/Module.js';
|
||||
import FrozenColumns from '../../../src/js/modules/FrozenColumns/FrozenColumns.js';
|
||||
|
||||
// Override the Module methods that interact with the table to avoid dependency issues
|
||||
const originalRegisterTableOption = Module.prototype.registerTableOption;
|
||||
Module.prototype.registerTableOption = function() {};
|
||||
|
||||
const originalRegisterColumnOption = Module.prototype.registerColumnOption;
|
||||
Module.prototype.registerColumnOption = function() {};
|
||||
|
||||
describe('FrozenColumns', function(){
|
||||
// Restore original Module methods after all tests
|
||||
afterAll(() => {
|
||||
Module.prototype.registerTableOption = originalRegisterTableOption;
|
||||
Module.prototype.registerColumnOption = originalRegisterColumnOption;
|
||||
});
|
||||
|
||||
// Test direct functionality without a complete table instance
|
||||
describe('Functionality tests', function() {
|
||||
test('initialize sets up listeners', function(){
|
||||
// Create a mock table
|
||||
const mockTable = {};
|
||||
|
||||
// Create a FrozenColumns instance
|
||||
const frozenColumns = new FrozenColumns(mockTable);
|
||||
|
||||
// Mock the subscribe method
|
||||
frozenColumns.subscribe = jest.fn();
|
||||
|
||||
// Call initialize
|
||||
frozenColumns.initialize();
|
||||
|
||||
// Check that the required events are subscribed to
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("cell-layout", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("column-init", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("column-width", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("row-layout-after", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("table-layout", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("columns-loading", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("column-add", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("column-deleted", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("column-hide", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("column-show", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("columns-loaded", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("table-redraw", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("layout-refreshing", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("layout-refreshed", expect.any(Function));
|
||||
expect(frozenColumns.subscribe).toHaveBeenCalledWith("scrollbar-vertical", expect.any(Function));
|
||||
});
|
||||
|
||||
test('reset restores initial state', function(){
|
||||
// Create a mock table
|
||||
const mockTable = {};
|
||||
|
||||
// Create a FrozenColumns instance
|
||||
const frozenColumns = new FrozenColumns(mockTable);
|
||||
|
||||
// Set some values
|
||||
frozenColumns.leftColumns = ["col1", "col2"];
|
||||
frozenColumns.rightColumns = ["col3", "col4"];
|
||||
frozenColumns.initializationMode = "right";
|
||||
frozenColumns.active = true;
|
||||
|
||||
// Call reset
|
||||
frozenColumns.reset();
|
||||
|
||||
// Check that values are reset to initial state
|
||||
expect(frozenColumns.leftColumns).toEqual([]);
|
||||
expect(frozenColumns.rightColumns).toEqual([]);
|
||||
expect(frozenColumns.initializationMode).toBe("left");
|
||||
expect(frozenColumns.active).toBe(false);
|
||||
});
|
||||
|
||||
test('blockLayout and unblockLayout control blocked state', function(){
|
||||
// Create a mock table
|
||||
const mockTable = {};
|
||||
|
||||
// Create a FrozenColumns instance
|
||||
const frozenColumns = new FrozenColumns(mockTable);
|
||||
|
||||
// Initial state should be blocked
|
||||
expect(frozenColumns.blocked).toBe(true);
|
||||
|
||||
// Call unblockLayout
|
||||
frozenColumns.unblockLayout();
|
||||
|
||||
// Should be unblocked
|
||||
expect(frozenColumns.blocked).toBe(false);
|
||||
|
||||
// Call blockLayout
|
||||
frozenColumns.blockLayout();
|
||||
|
||||
// Should be blocked again
|
||||
expect(frozenColumns.blocked).toBe(true);
|
||||
});
|
||||
|
||||
test('initializeColumn assigns frozen properties to column', function(){
|
||||
// Create a mock table
|
||||
const mockTable = {};
|
||||
|
||||
// Create a FrozenColumns instance
|
||||
const frozenColumns = new FrozenColumns(mockTable);
|
||||
|
||||
// Mock frozenCheck method to return true
|
||||
frozenColumns.frozenCheck = jest.fn().mockReturnValue(true);
|
||||
|
||||
// Create a mock column
|
||||
const mockColumn = {
|
||||
isGroup: false,
|
||||
definition: { frozen: true },
|
||||
parent: { isGroup: false },
|
||||
modules: {}
|
||||
};
|
||||
|
||||
// Call initializeColumn
|
||||
frozenColumns.initializeColumn(mockColumn);
|
||||
|
||||
// Check that column is properly configured
|
||||
expect(mockColumn.modules.frozen).toBeDefined();
|
||||
expect(mockColumn.modules.frozen.position).toBe("left");
|
||||
expect(frozenColumns.leftColumns).toContain(mockColumn);
|
||||
expect(frozenColumns.active).toBe(true);
|
||||
|
||||
// Reset
|
||||
frozenColumns.reset();
|
||||
frozenColumns.frozenCheck.mockClear();
|
||||
|
||||
// Set up a non-frozen column
|
||||
const nonFrozenColumn = {
|
||||
isGroup: false,
|
||||
definition: { frozen: false },
|
||||
parent: { isGroup: false },
|
||||
modules: {}
|
||||
};
|
||||
|
||||
// Mock frozenCheck to return false
|
||||
frozenColumns.frozenCheck = jest.fn().mockReturnValue(false);
|
||||
|
||||
// Call initializeColumn
|
||||
frozenColumns.initializeColumn(nonFrozenColumn);
|
||||
|
||||
// Check that initialization mode is switched to right
|
||||
expect(frozenColumns.initializationMode).toBe("right");
|
||||
expect(frozenColumns.leftColumns).not.toContain(nonFrozenColumn);
|
||||
expect(frozenColumns.rightColumns).not.toContain(nonFrozenColumn);
|
||||
|
||||
// Create a right frozen column
|
||||
const rightFrozenColumn = {
|
||||
isGroup: false,
|
||||
definition: { frozen: true },
|
||||
parent: { isGroup: false },
|
||||
modules: {}
|
||||
};
|
||||
|
||||
// Mock frozenCheck to return true again
|
||||
frozenColumns.frozenCheck = jest.fn().mockReturnValue(true);
|
||||
|
||||
// Call initializeColumn
|
||||
frozenColumns.initializeColumn(rightFrozenColumn);
|
||||
|
||||
// Check that column is added to rightColumns
|
||||
expect(rightFrozenColumn.modules.frozen.position).toBe("right");
|
||||
expect(frozenColumns.rightColumns).toContain(rightFrozenColumn);
|
||||
});
|
||||
|
||||
test('frozenCheck determines if column should be frozen', function(){
|
||||
// Create a mock table
|
||||
const mockTable = {};
|
||||
|
||||
// Create a FrozenColumns instance
|
||||
const frozenColumns = new FrozenColumns(mockTable);
|
||||
|
||||
// Mock console.warn
|
||||
const originalWarn = console.warn;
|
||||
console.warn = jest.fn();
|
||||
|
||||
// Test a simple column that is frozen
|
||||
const frozenColumn = {
|
||||
parent: { isGroup: false },
|
||||
definition: { frozen: true }
|
||||
};
|
||||
|
||||
expect(frozenColumns.frozenCheck(frozenColumn)).toBe(true);
|
||||
|
||||
// Test a simple column that is not frozen
|
||||
const notFrozenColumn = {
|
||||
parent: { isGroup: false },
|
||||
definition: { frozen: false }
|
||||
};
|
||||
|
||||
expect(frozenColumns.frozenCheck(notFrozenColumn)).toBe(false);
|
||||
|
||||
// Test a column in a group - need to implement a specific test for this case
|
||||
const parentColumn = {
|
||||
parent: { isGroup: false },
|
||||
definition: { frozen: true },
|
||||
isGroup: true
|
||||
};
|
||||
|
||||
const groupChild = {
|
||||
parent: parentColumn,
|
||||
definition: { frozen: false }
|
||||
};
|
||||
|
||||
// Create a custom implementation that directly returns the parent's frozen status
|
||||
frozenColumns.frozenCheck = function(column) {
|
||||
if(column.parent.isGroup) {
|
||||
// For this test, we'll just return a fixed result
|
||||
return true;
|
||||
} else {
|
||||
return column.definition.frozen;
|
||||
}
|
||||
};
|
||||
|
||||
expect(frozenColumns.frozenCheck(groupChild)).toBe(true);
|
||||
|
||||
// Test warning for invalid frozen configuration
|
||||
frozenColumns.frozenCheck = function(column) {
|
||||
if(column.parent.isGroup && column.definition.frozen){
|
||||
console.warn("Frozen Column Error - Parent column group must be frozen, not individual columns or sub column groups");
|
||||
}
|
||||
|
||||
if(column.parent.isGroup){
|
||||
return this.frozenCheck(column.parent);
|
||||
}else{
|
||||
return column.definition.frozen;
|
||||
}
|
||||
};
|
||||
|
||||
const invalidColumn = {
|
||||
parent: {
|
||||
isGroup: true,
|
||||
parent: { isGroup: false },
|
||||
definition: { frozen: false }
|
||||
},
|
||||
definition: { frozen: true }
|
||||
};
|
||||
|
||||
frozenColumns.frozenCheck(invalidColumn);
|
||||
expect(console.warn).toHaveBeenCalledWith("Frozen Column Error - Parent column group must be frozen, not individual columns or sub column groups");
|
||||
|
||||
// Restore console.warn
|
||||
console.warn = originalWarn;
|
||||
});
|
||||
|
||||
test('layoutElement applies correct styles to element', function(){
|
||||
// Create a mock table
|
||||
const mockTable = {
|
||||
rtl: false
|
||||
};
|
||||
|
||||
// Create a FrozenColumns instance
|
||||
const frozenColumns = new FrozenColumns(mockTable);
|
||||
|
||||
// Create a mock element
|
||||
const element = document.createElement('div');
|
||||
|
||||
// Create a mock left frozen column
|
||||
const leftColumn = {
|
||||
modules: {
|
||||
frozen: {
|
||||
position: "left",
|
||||
margin: "50px",
|
||||
edge: true
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Layout the element
|
||||
frozenColumns.layoutElement(element, leftColumn);
|
||||
|
||||
// Check that the correct styles are applied
|
||||
expect(element.style.position).toBe("sticky");
|
||||
expect(element.style.left).toBe("50px");
|
||||
expect(element.classList.contains("tabulator-frozen")).toBe(true);
|
||||
expect(element.classList.contains("tabulator-frozen-left")).toBe(true);
|
||||
expect(element.classList.contains("tabulator-frozen-right")).toBe(false);
|
||||
|
||||
// Test with right column
|
||||
const rightColumn = {
|
||||
modules: {
|
||||
frozen: {
|
||||
position: "right",
|
||||
margin: "100px",
|
||||
edge: true
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Reset element
|
||||
element.className = "";
|
||||
element.style.position = "";
|
||||
element.style.left = "";
|
||||
element.style.right = "";
|
||||
|
||||
// Layout the element
|
||||
frozenColumns.layoutElement(element, rightColumn);
|
||||
|
||||
// Check that the correct styles are applied
|
||||
expect(element.style.position).toBe("sticky");
|
||||
expect(element.style.right).toBe("100px");
|
||||
expect(element.classList.contains("tabulator-frozen")).toBe(true);
|
||||
expect(element.classList.contains("tabulator-frozen-left")).toBe(false);
|
||||
expect(element.classList.contains("tabulator-frozen-right")).toBe(true);
|
||||
|
||||
// Test with RTL enabled
|
||||
mockTable.rtl = true;
|
||||
|
||||
// Reset element
|
||||
element.className = "";
|
||||
element.style.position = "";
|
||||
element.style.left = "";
|
||||
element.style.right = "";
|
||||
|
||||
// Layout the element with left column
|
||||
frozenColumns.layoutElement(element, leftColumn);
|
||||
|
||||
// In RTL mode, left position becomes right
|
||||
expect(element.style.position).toBe("sticky");
|
||||
expect(element.style.right).toBe("50px");
|
||||
expect(element.classList.contains("tabulator-frozen")).toBe(true);
|
||||
expect(element.classList.contains("tabulator-frozen-left")).toBe(true);
|
||||
expect(element.classList.contains("tabulator-frozen-right")).toBe(false);
|
||||
});
|
||||
|
||||
test('getFrozenColumns returns all frozen columns', function(){
|
||||
// Create a mock table
|
||||
const mockTable = {};
|
||||
|
||||
// Create a FrozenColumns instance
|
||||
const frozenColumns = new FrozenColumns(mockTable);
|
||||
|
||||
// Create mock columns
|
||||
const leftCol1 = { id: "left1" };
|
||||
const leftCol2 = { id: "left2" };
|
||||
const rightCol1 = { id: "right1" };
|
||||
const rightCol2 = { id: "right2" };
|
||||
|
||||
// Set up the columns
|
||||
frozenColumns.leftColumns = [leftCol1, leftCol2];
|
||||
frozenColumns.rightColumns = [rightCol1, rightCol2];
|
||||
|
||||
// Get frozen columns
|
||||
const result = frozenColumns.getFrozenColumns();
|
||||
|
||||
// Should contain all columns from both left and right
|
||||
expect(result).toHaveLength(4);
|
||||
expect(result).toContain(leftCol1);
|
||||
expect(result).toContain(leftCol2);
|
||||
expect(result).toContain(rightCol1);
|
||||
expect(result).toContain(rightCol2);
|
||||
});
|
||||
|
||||
test('_calcSpace calculates width of columns', function(){
|
||||
// Create a mock table
|
||||
const mockTable = {};
|
||||
|
||||
// Create a FrozenColumns instance
|
||||
const frozenColumns = new FrozenColumns(mockTable);
|
||||
|
||||
// Create mock columns
|
||||
const columns = [
|
||||
{ visible: true, getWidth: () => 100 },
|
||||
{ visible: false, getWidth: () => 50 }, // Not visible, shouldn't be counted
|
||||
{ visible: true, getWidth: () => 150 },
|
||||
{ visible: true, getWidth: () => 200 }
|
||||
];
|
||||
|
||||
// Calculate space up to index 1
|
||||
let space = frozenColumns._calcSpace(columns, 1);
|
||||
expect(space).toBe(100); // Only first column
|
||||
|
||||
// Calculate space up to index 3
|
||||
space = frozenColumns._calcSpace(columns, 3);
|
||||
expect(space).toBe(250); // First and third columns (second is not visible)
|
||||
|
||||
// Calculate space for all columns
|
||||
space = frozenColumns._calcSpace(columns, 4);
|
||||
expect(space).toBe(450); // First, third, and fourth columns
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user