Skip to content
Source
Sign inSign up

projectFaviconRequests.test.ts

86 lines3.5 KB

1import { describe, expect, it } from "vite-plus/test";
2​
3import {
4 beginProjectFaviconRequest,
5 createProjectFaviconRequest,
6 hasLoadedProjectFavicon,
7 markProjectFaviconFailed,
8 markProjectFaviconLoaded,
9} from "./projectFaviconRequests";
10​
11describe("project favicon requests", () => {
12 it("ignores callbacks from a superseded URL", () => {
13 const cacheKey = "environment-1:/workspace:v1-favicon.svg";
14 const expiredUrl = "https://environment.example/api/assets/expired/v1-favicon.svg";
15 const refreshedUrl = "https://environment.example/api/assets/refreshed/v1-favicon.svg";
16​
17 const expiredRequest = createProjectFaviconRequest(cacheKey, expiredUrl);
18 const endExpiredRequest = beginProjectFaviconRequest(expiredRequest);
19 markProjectFaviconLoaded(expiredRequest);
20 const refreshedRequest = createProjectFaviconRequest(cacheKey, refreshedUrl);
21 const endRefreshedRequest = beginProjectFaviconRequest(refreshedRequest);
22​
23 expect(markProjectFaviconLoaded(expiredRequest)).toBe(false);
24 expect(markProjectFaviconFailed(expiredRequest)).toBe(false);
25 expect(hasLoadedProjectFavicon(cacheKey)).toBe(true);
26 expect(markProjectFaviconFailed(refreshedRequest)).toBe(true);
27 expect(hasLoadedProjectFavicon(cacheKey)).toBe(false);
28​
29 endRefreshedRequest();
30 endExpiredRequest();
31 });
32​
33 it("does not supersede a request until the next request begins", () => {
34 const cacheKey = "environment-1:/workspace:v3-favicon.svg";
35 const committedUrl = "https://environment.example/api/assets/current/v3-favicon.svg";
36 const abandonedUrl = "https://environment.example/api/assets/abandoned/v3-favicon.svg";
37 const committedRequest = createProjectFaviconRequest(cacheKey, committedUrl);
38 const endCommittedRequest = beginProjectFaviconRequest(committedRequest);
39​
40 createProjectFaviconRequest(cacheKey, abandonedUrl);
41​
42 expect(markProjectFaviconLoaded(committedRequest)).toBe(true);
43 expect(hasLoadedProjectFavicon(cacheKey)).toBe(true);
44​
45 endCommittedRequest();
46 });
47​
48 it("restores the remaining active URL when a newer request ends", () => {
49 const cacheKey = "environment-1:/workspace:v4-favicon.svg";
50 const firstRequest = createProjectFaviconRequest(
51 cacheKey,
52 "https://environment.example/api/assets/first/v4-favicon.svg",
53 );
54 const secondRequest = createProjectFaviconRequest(
55 cacheKey,
56 "https://environment.example/api/assets/second/v4-favicon.svg",
57 );
58 const endFirstRequest = beginProjectFaviconRequest(firstRequest);
59 const endSecondRequest = beginProjectFaviconRequest(secondRequest);
60​
61 expect(markProjectFaviconLoaded(firstRequest)).toBe(false);
62 endSecondRequest();
63 expect(markProjectFaviconLoaded(firstRequest)).toBe(true);
64 endFirstRequest();
65 expect(markProjectFaviconLoaded(firstRequest)).toBe(false);
66 });
67​
68 it("bounds remembered loaded revisions", () => {
69 const firstCacheKey = "environment-1:/workspace:revision-0";
70 let lastCacheKey = firstCacheKey;
71​
72 for (let revision = 0; revision < 300; revision++) {
73 lastCacheKey = `environment-1:/workspace:revision-${revision}`;
74 const request = createProjectFaviconRequest(
75 lastCacheKey,
76 `https://environment.example/api/assets/revision-${revision}/favicon.svg`,
77 );
78 const endRequest = beginProjectFaviconRequest(request);
79 markProjectFaviconLoaded(request);
80 endRequest();
81 }
82​
83 expect(hasLoadedProjectFavicon(firstCacheKey)).toBe(false);
84 expect(hasLoadedProjectFavicon(lastCacheKey)).toBe(true);
85 });
86});