1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
describe('hx-push-url and hx-replace-url attributes', function() {
beforeEach(() => {
setupTest(this.currentTest)
// Clear any existing history state
if (history.state && history.state.htmx) {
history.replaceState(null, '', location.pathname);
}
})
afterEach(() => {
cleanupTest()
})
it('should push URL to history with hx-push-url="true"', async function() {
mockResponse('GET', '/test', 'Test Response');
let historyEventFired = false;
let eventPath = null;
// Listen for the history event
const handler = (event) => {
historyEventFired = true;
eventPath = event.detail.path;
};
document.addEventListener('htmx:after:push:into:history', handler);
try {
let btn = createProcessedHTML('<button hx-get="/test" hx-push-url="true">Click me</button>');
btn.click()
await forRequest();
playground().textContent.should.equal('Test Response');
historyEventFired.should.equal(true);
eventPath.should.equal('/test');
} finally {
document.removeEventListener('htmx:after:push:into:history', handler);
}
});
it('should replace URL in history with hx-replace-url="true"', async function() {
mockResponse('GET', '/test', 'Test Response');
let historyEventFired = false;
let eventPath = null;
// Listen for the history event
const handler = (event) => {
historyEventFired = true;
eventPath = event.detail.path;
};
document.addEventListener('htmx:after:replace:into:history', handler);
try {
let btn = createProcessedHTML('<button hx-get="/test" hx-replace-url="true">Click me</button>');
btn.click()
await forRequest();
playground().textContent.should.equal('Test Response');
historyEventFired.should.equal(true);
eventPath.should.equal('/test');
} finally {
document.removeEventListener('htmx:after:replace:into:history', handler);
}
});
it('should handle custom URL with hx-push-url="/custom"', async function() {
mockResponse('GET', '/test', 'Test Response');
let historyEventFired = false;
let eventPath = null;
// Listen for the history event
const handler = (event) => {
historyEventFired = true;
eventPath = event.detail.path;
};
document.addEventListener('htmx:after:push:into:history', handler);
try {
let btn = createProcessedHTML('<button hx-get="/test" hx-push-url="/custom">Click me</button>');
btn.click()
await forRequest();
playground().textContent.should.equal('Test Response');
historyEventFired.should.equal(true);
eventPath.should.equal('/custom');
} finally {
document.removeEventListener('htmx:after:push:into:history', handler);
}
});
it('should not push to history when hx-push-url="false"', async function() {
mockResponse('GET', '/test', 'Test Response');
let historyEventFired = false;
// Listen for the history event (should not fire)
const handler = (event) => {
historyEventFired = true;
};
document.addEventListener('htmx:after:push:into:history', handler);
try {
let btn = createProcessedHTML('<button hx-get="/test" hx-push-url="false">Click me</button>');
btn.click()
await forRequest();
playground().textContent.should.equal('Test Response');
historyEventFired.should.equal(false);
} finally {
document.removeEventListener('htmx:after:push:into:history', handler);
}
});
it('should fire htmx:before:history:update event', async function() {
mockResponse('GET', '/test', 'Test Response');
let beforeEventFired = false;
let eventDetails = null;
// Listen for the before history update event
const handler = (event) => {
beforeEventFired = true;
eventDetails = event.detail;
};
document.addEventListener('htmx:before:history:update', handler);
try {
let btn = createProcessedHTML('<button hx-get="/test" hx-push-url="true">Click me</button>');
btn.click()
await forRequest();
playground().textContent.should.equal('Test Response');
beforeEventFired.should.equal(true);
eventDetails.history.type.should.equal('push');
eventDetails.history.path.should.equal('/test');
} finally {
document.removeEventListener('htmx:before:history:update', handler);
}
});
});
|