@wdio/image-comparison-core
Version:
Image comparison core module for @wdio/visual-service - WebdriverIO visual testing framework
80 lines (79 loc) • 3.35 kB
JavaScript
import { describe, it, expect, vi, beforeEach } from 'vitest';
import scrollElementIntoView from './scrollElementIntoView.js';
describe('scrollElementIntoView', () => {
let mockElement;
let mockHtmlNode;
let mockBodyNode;
let mockStyleTag;
let mockHead;
beforeEach(() => {
mockElement = {
getBoundingClientRect: vi.fn().mockReturnValue({ top: 100 }),
};
mockHtmlNode = {
scrollTop: 0,
get scrollHeight() { return 1000; },
get clientHeight() { return 500; },
};
mockBodyNode = {
scrollTop: 0,
get scrollHeight() { return 1000; },
get clientHeight() { return 500; },
};
mockStyleTag = {
innerHTML: '',
};
mockHead = {
appendChild: vi.fn(),
removeChild: vi.fn(),
};
global.document = {
documentElement: mockHtmlNode,
body: mockBodyNode,
createElement: vi.fn().mockReturnValue(mockStyleTag),
head: mockHead,
};
});
it('should scroll element into view when html node is scrollable', () => {
const addressBarShadowPadding = 10;
const result = scrollElementIntoView(mockElement, addressBarShadowPadding);
expect(result).toBe(0);
expect(mockHtmlNode.scrollTop).toBe(90);
expect(mockHead.appendChild).toHaveBeenCalledWith(mockStyleTag);
expect(mockHead.removeChild).toHaveBeenCalledWith(mockStyleTag);
});
it('should scroll element into view when body node is scrollable', () => {
Object.defineProperty(mockHtmlNode, 'scrollHeight', { value: 500 });
const addressBarShadowPadding = 10;
const result = scrollElementIntoView(mockElement, addressBarShadowPadding);
expect(result).toBe(0);
expect(mockBodyNode.scrollTop).toBe(90);
expect(mockHead.appendChild).toHaveBeenCalledWith(mockStyleTag);
expect(mockHead.removeChild).toHaveBeenCalledWith(mockStyleTag);
});
it('should return current scroll position when html node has scroll', () => {
mockHtmlNode.scrollTop = 50;
const addressBarShadowPadding = 10;
const result = scrollElementIntoView(mockElement, addressBarShadowPadding);
expect(result).toBe(50);
expect(mockHtmlNode.scrollTop).toBe(90);
});
it('should return current scroll position when body node has scroll', () => {
mockHtmlNode.scrollTop = 0;
mockBodyNode.scrollTop = 50;
Object.defineProperty(mockHtmlNode, 'scrollHeight', { value: 500 });
const addressBarShadowPadding = 10;
const result = scrollElementIntoView(mockElement, addressBarShadowPadding);
expect(result).toBe(50);
expect(mockBodyNode.scrollTop).toBe(90);
});
it('should not scroll when neither html nor body is scrollable', () => {
Object.defineProperty(mockHtmlNode, 'scrollHeight', { value: 500 });
Object.defineProperty(mockBodyNode, 'scrollHeight', { value: 500 });
const addressBarShadowPadding = 10;
const result = scrollElementIntoView(mockElement, addressBarShadowPadding);
expect(result).toBe(0);
expect(mockHtmlNode.scrollTop).toBe(0);
expect(mockBodyNode.scrollTop).toBe(0);
});
});