Path: blob/main/full-client/test/waitForLocation.test.ts
1028 views
import { Helpers } from '@secret-agent/testing';1import Resolvable from '@secret-agent/commons/Resolvable';2import { getLogo, ITestKoaServer } from '@secret-agent/testing/helpers';3import { Handler } from '../index';45let handler: Handler;6let koaServer: ITestKoaServer;7beforeAll(async () => {8handler = new Handler();9koaServer = await Helpers.runKoaServer(true);10Helpers.onClose(() => handler.close(), true);11});12afterAll(Helpers.afterAll);13afterEach(Helpers.afterEach);1415describe('basic waitForLocation change detections', () => {16it('runs basic flow', async () => {17koaServer.get('/start', ctx => {18ctx.body = `19<body>20<button>Click Me</button>21<script>22document.querySelector('button').addEventListener('click', () => {23window.location = '/finish';24});25</script>26</body>27`;28});29koaServer.get('/finish', ctx => (ctx.body = `Finished!`));3031const startUrl = `${koaServer.baseUrl}/start`;32const finishUrl = `${koaServer.baseUrl}/finish`;33const agent = await handler.createAgent();3435await agent.goto(startUrl);36const firstUrl = await agent.url;37await agent.waitForPaintingStable();38const button = agent.document.querySelector('button');39await agent.waitForElement(button);4041await agent.interact({ click: button });42await agent.waitForLocation('change');43const lastUrl = await agent.url;4445expect(firstUrl).toBe(startUrl);46expect(lastUrl).toBe(finishUrl);4748await agent.close();49});5051it('should trigger a location change if location changed but also redirected', async () => {52koaServer.get('/page1', ctx => {53ctx.body = `54<body>55<a href="/page2">Click Me</a>56</body>57`;58});59koaServer.get('/page2', ctx => {60ctx.redirect('/page3');61});6263koaServer.get('/page3', ctx => {64ctx.body = `65<body>66<a href="/page4">Click Me</a>67</body>68`;69});7071koaServer.get('/page4', ctx => {72ctx.redirect('/finish');73});7475koaServer.get('/finish', ctx => (ctx.body = `Finished!`));76const agent = await handler.createAgent();77await agent.goto(`${koaServer.baseUrl}/page1`);78const startlink = agent.document.querySelector('a');79await agent.interact({ click: startlink, waitForElementVisible: startlink });80await agent.waitForLocation('change');81expect(await agent.url).toBe(`${koaServer.baseUrl}/page3`);8283const nextlink = agent.document.querySelector('a');84await agent.interact({ click: nextlink, waitForElementVisible: nextlink });85await agent.waitForLocation('change');86expect(await agent.url).toBe(`${koaServer.baseUrl}/finish`);8788await agent.close();89});9091it('should support 2 location changes', async () => {92koaServer.get('/loc1', ctx => {93ctx.body = `94<body>95<a href="/loc2">Click Me</a>96</body>97`;98});99koaServer.get('/loc2', ctx => {100ctx.body = `101<body>102<a href="/loc3">Click Me</a>103</body>104`;105});106koaServer.get('/loc3', ctx => (ctx.body = `Finished!`));107108const startUrl = `${koaServer.baseUrl}/loc1`;109const page2Url = `${koaServer.baseUrl}/loc2`;110const finishUrl = `${koaServer.baseUrl}/loc3`;111const agent = await handler.createAgent();112113await agent.goto(startUrl);114const firstUrl = await agent.url;115await agent.waitForPaintingStable();116const readyLink = agent.document.querySelector('a');117await agent.interact({ click: readyLink, waitForElementVisible: readyLink });118await agent.waitForLocation('change');119const secondUrl = await agent.url;120await agent.waitForPaintingStable();121122const readyLink2 = agent.document.querySelector('a');123await agent.interact({ click: readyLink2, waitForElementVisible: readyLink2 });124await agent.waitForLocation('change');125await agent.waitForPaintingStable();126const lastUrl = await agent.url;127128expect(firstUrl).toBe(startUrl);129expect(secondUrl).toBe(page2Url);130expect(lastUrl).toBe(finishUrl);131132await agent.close();133});134135it('should trigger location change when a page redirects in-page before load', async () => {136const imagePromise = new Resolvable();137koaServer.get('/img.png', async ctx => {138ctx.set('Content-Type', 'image/png');139await imagePromise.promise;140ctx.body = getLogo();141});142143koaServer.get('/change-form', ctx => {144ctx.body = `145<body>146<form action="/change-inpage" method="get">147<input type="submit" name="submit" value="value" >148</form>149</body>150`;151});152153koaServer.get('/change-inpage', ctx => {154ctx.body = `155<body>156<script>157history.pushState({}, '', '/change-inpage/1');158</script>159<img src="/img.png">160</body>161`;162});163164const agent = await handler.createAgent();165166await agent.goto(`${koaServer.baseUrl}/change-form`);167await agent.interact({ click: agent.document.querySelector('input') });168const result = await agent.waitForLocation('change');169await expect(result.response.url).resolves.toBe(170`${koaServer.baseUrl}/change-inpage?submit=value`,171);172imagePromise.resolve(null);173await agent.waitForPaintingStable();174await expect(agent.url).resolves.toBe(`${koaServer.baseUrl}/change-inpage/1`);175176await agent.close();177});178179it('should support timing out a location change', async () => {180koaServer.get('/loaded1', ctx => {181ctx.body = `182<body>183<a href="/loaded2">Click Me</a>184</body>185`;186});187koaServer.get('/loaded2', ctx => {188ctx.body = `<body><h1>Loaded 2</h1></body>`;189});190191const agent = await handler.createAgent();192193await agent.goto(`${koaServer.baseUrl}/loaded1`);194await agent.waitForPaintingStable();195const link = agent.document.querySelector('a');196await agent.click(link);197await agent.waitForLocation('change', { timeoutMs: 500 });198await agent.waitForPaintingStable();199expect(await agent.url).toBe(`${koaServer.baseUrl}/loaded2`);200201await expect(agent.waitForLocation('change', { timeoutMs: 500 })).rejects.toThrowError(202'Timeout',203);204await agent.close();205});206207it('can wait for a reload', async () => {208let counter = 0;209koaServer.get('/refresh', ctx => {210if (counter === 0) {211ctx.body = `212<head><meta http-equiv = "refresh" content = "0; url = ${koaServer.baseUrl}/refresh" /></head>213<body><h1>Hi</h1></body>214`;215} else {216ctx.body = `217<body><h1>Loaded</h1></body>218`;219}220counter += 1;221});222const agent = await handler.createAgent();223await agent.goto(`${koaServer.baseUrl}/refresh`);224225await expect(agent.waitForLocation('reload')).resolves.toBeTruthy();226});227228it('will trigger reload if the same page is loaded again', async () => {229let counter = 0;230231koaServer.post('/postback', ctx => {232ctx.redirect('/postback');233});234235koaServer.get('/postback', ctx => {236if (counter === 0) {237ctx.body = `238<body>239<h1>Hi</h1>240<form action="/postback" method="post">241<input type="submit" name="submit">242</form>243</body>244`;245} else {246ctx.body = `<body><h1>Loaded</h1></body>`;247}248counter += 1;249});250const agent = await handler.createAgent();251await agent.goto(`${koaServer.baseUrl}/postback`);252await agent.click(agent.activeTab.document.querySelector('input'));253254await expect(agent.waitForLocation('reload')).resolves.toBeTruthy();255});256});257258259