Skip to content

Commit f2c28cc

Browse files
committed
refactor: split tests in multiple files
1 parent fda7628 commit f2c28cc

File tree

3 files changed

+408
-320
lines changed

3 files changed

+408
-320
lines changed
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
2+
import { spy } from 'sinon';
3+
4+
import { range } from 'lit/directives/range.js';
5+
import { defineComponents } from '../common/definitions/defineComponents.js';
6+
import { first, last } from '../common/util.js';
7+
import {
8+
simulateDragEnd,
9+
simulateDragStart,
10+
simulateDrop,
11+
} from '../common/utils.spec.js';
12+
import IgcTileManagerComponent from './tile-manager.js';
13+
import type IgcTileComponent from './tile.js';
14+
15+
describe('Tile drag and drop', () => {
16+
before(() => {
17+
defineComponents(IgcTileManagerComponent);
18+
});
19+
20+
let tileManager: IgcTileManagerComponent;
21+
22+
function getTiles() {
23+
return Array.from(tileManager.querySelectorAll('igc-tile'));
24+
}
25+
// function getTileBaseWrapper(element: IgcTileComponent) {
26+
// return element.renderRoot.querySelector<HTMLDivElement>('[part~="base"]')!;
27+
// }
28+
29+
function getTileBaseWrapper(element: IgcTileComponent) {
30+
const resizeElement = element.renderRoot.querySelector('igc-resize');
31+
32+
if (resizeElement) {
33+
return resizeElement.querySelector<HTMLDivElement>('[part~="base"]')!;
34+
}
35+
36+
return element.renderRoot.querySelector<HTMLDivElement>('[part~="base"]')!;
37+
}
38+
39+
function createTileManager() {
40+
const result = Array.from(range(5)).map(
41+
(i) => html`
42+
<igc-tile id="tile${i}" colSpan="5" rowSpan="5">
43+
<igc-tile-header slot="header">
44+
<h3 slot="title">Tile ${i + 1}</h3>
45+
</igc-tile-header>
46+
47+
<div>
48+
<p>Content in tile ${i + 1}</p>
49+
</div>
50+
</igc-tile>
51+
`
52+
);
53+
return html`<igc-tile-manager>${result}</igc-tile-manager>`;
54+
}
55+
56+
describe('Tile drag behavior', () => {
57+
beforeEach(async () => {
58+
tileManager = await fixture<IgcTileManagerComponent>(createTileManager());
59+
});
60+
61+
const dragAndDrop = async (draggedTile: Element, dropTarget: Element) => {
62+
simulateDragStart(draggedTile);
63+
simulateDrop(dropTarget);
64+
simulateDragEnd(draggedTile);
65+
await elementUpdated(tileManager);
66+
};
67+
68+
it("should correctly fire 'dragStart' event", async () => {
69+
const eventSpy = spy(tileManager, 'emitEvent');
70+
71+
const tile = first(tileManager.tiles);
72+
const dataTransfer = new DataTransfer();
73+
dataTransfer.setData('text/plain', 'Tile data for drag operation');
74+
75+
simulateDragStart(tile);
76+
await elementUpdated(tileManager);
77+
78+
expect(eventSpy).calledOnceWithExactly('igcTileDragStarted', {
79+
detail: tile,
80+
});
81+
});
82+
83+
it('should adjust reflected tiles positions in slide mode', async () => {
84+
const tiles = getTiles();
85+
const draggedTile = first(tiles);
86+
const dropTarget = tiles[2];
87+
88+
expect(tileManager.dragMode).to.equal('slide');
89+
tileManager.tiles.forEach((tile, index) => {
90+
expect(tile.id).to.equal(`tile${index}`);
91+
});
92+
expect(draggedTile.position).to.equal(0);
93+
expect(dropTarget.position).to.equal(2);
94+
95+
await dragAndDrop(draggedTile, dropTarget);
96+
97+
const expectedIdsAfterDrag = [
98+
'tile1',
99+
'tile2',
100+
'tile0',
101+
'tile3',
102+
'tile4',
103+
];
104+
tileManager.tiles.forEach((tile, index) => {
105+
expect(tile.id).to.equal(expectedIdsAfterDrag[index]);
106+
});
107+
expect(draggedTile.position).to.equal(2);
108+
expect(dropTarget.position).to.equal(1);
109+
});
110+
111+
it('should not change order when dragging a tile onto itself in slide mode', async () => {
112+
const initialTiles = tileManager.tiles;
113+
const tile = first(tileManager.tiles);
114+
115+
expect(tileManager.dragMode).to.equal('slide');
116+
expect(tileManager.tiles[0].id).to.equal('tile0');
117+
expect(tileManager.tiles[1].id).to.equal('tile1');
118+
119+
await dragAndDrop(tile, tile);
120+
121+
expect(getTiles()).eql(initialTiles);
122+
expect(tileManager.tiles[0].id).to.equal('tile0');
123+
expect(tileManager.tiles[1].id).to.equal('tile1');
124+
});
125+
126+
it('should swap the dragged tile with the drop target in swap mode', async () => {
127+
const tiles = getTiles();
128+
const draggedTile = first(tiles);
129+
const dropTarget = last(tiles);
130+
131+
expect(tileManager.dragMode).to.equal('slide');
132+
expect(tileManager.tiles[0].id).to.equal('tile0');
133+
expect(tileManager.tiles[4].id).to.equal('tile4');
134+
expect(draggedTile.position).to.equal(0);
135+
expect(dropTarget.position).to.equal(4);
136+
137+
tileManager.dragMode = 'swap';
138+
await dragAndDrop(draggedTile, dropTarget);
139+
140+
expect(tileManager.tiles[0].id).to.equal('tile4');
141+
expect(tileManager.tiles[4].id).to.equal('tile0');
142+
expect(draggedTile.position).to.equal(4);
143+
expect(dropTarget.position).to.equal(0);
144+
});
145+
146+
it('should not change order when dragging a tile onto itself in swap mode', async () => {
147+
const initialTiles = tileManager.tiles;
148+
const tile = first(tileManager.tiles);
149+
150+
expect(tileManager.dragMode).to.equal('slide');
151+
expect(tileManager.tiles[0].id).to.equal('tile0');
152+
expect(tileManager.tiles[1].id).to.equal('tile1');
153+
154+
tileManager.dragMode = 'swap';
155+
await dragAndDrop(tile, tile);
156+
157+
expect(getTiles()).eql(initialTiles);
158+
expect(tileManager.tiles[0].id).to.equal('tile0');
159+
expect(tileManager.tiles[1].id).to.equal('tile1');
160+
});
161+
162+
it('should prevent dragging when `disableDrag` is true', async () => {
163+
const draggedTile = last(tileManager.tiles);
164+
const dropTarget = first(tileManager.tiles);
165+
const eventSpy = spy(tileManager, 'emitEvent');
166+
const tileWrapper = getTileBaseWrapper(draggedTile);
167+
168+
expect(tileWrapper.getAttribute('part')).to.include('draggable');
169+
170+
draggedTile.disableDrag = true;
171+
await elementUpdated(tileManager);
172+
173+
expect(tileWrapper.getAttribute('part')).to.not.include('draggable');
174+
175+
await dragAndDrop(draggedTile, dropTarget);
176+
177+
expect(eventSpy).not.calledWith('igcTileDragStarted');
178+
expect(tileManager.tiles[0].id).to.equal('tile0');
179+
expect(tileManager.tiles[4].id).to.equal('tile4');
180+
});
181+
});
182+
});

0 commit comments

Comments
 (0)