|
1 | 1 | import { http, HttpResponse } from "msw";
|
2 | 2 | import { mockAccountId, mockApiToken } from "./helpers/mock-account-id";
|
3 | 3 | import { mockConsoleMethods } from "./helpers/mock-console";
|
| 4 | +import { mockPrompt } from "./helpers/mock-dialogs"; |
| 5 | +import { useMockIsTTY } from "./helpers/mock-istty"; |
4 | 6 | import { msw } from "./helpers/msw";
|
5 | 7 | import { runInTempDir } from "./helpers/run-in-tmp";
|
6 | 8 | import { runWrangler } from "./helpers/run-wrangler";
|
@@ -35,6 +37,7 @@ describe("wrangler", () => {
|
35 | 37 | wrangler queues consumer Configure Queue consumers
|
36 | 38 | wrangler queues pause-delivery <name> Pause message delivery for a Queue
|
37 | 39 | wrangler queues resume-delivery <name> Resume message delivery for a Queue
|
| 40 | + wrangler queues purge <name> Purge messages from a Queue |
38 | 41 |
|
39 | 42 | GLOBAL FLAGS
|
40 | 43 | -c, --config Path to Wrangler configuration file [string]
|
@@ -2066,4 +2069,181 @@ describe("wrangler", () => {
|
2066 | 2069 | `);
|
2067 | 2070 | });
|
2068 | 2071 | });
|
| 2072 | + |
| 2073 | + describe("purge", () => { |
| 2074 | + const { setIsTTY } = useMockIsTTY(); |
| 2075 | + beforeEach(() => { |
| 2076 | + setIsTTY(false); |
| 2077 | + }); |
| 2078 | + |
| 2079 | + function mockPurgeRequest() { |
| 2080 | + const requests = { count: 0 }; |
| 2081 | + |
| 2082 | + msw.use( |
| 2083 | + http.post( |
| 2084 | + "*/accounts/:accountId/queues/:queueId/purge", |
| 2085 | + async ({ request }) => { |
| 2086 | + requests.count += 1; |
| 2087 | + |
| 2088 | + const body = (await request.json()) as { |
| 2089 | + delete_messages_permanently: boolean; |
| 2090 | + }; |
| 2091 | + expect(body.delete_messages_permanently).toEqual(true); |
| 2092 | + return HttpResponse.json({ |
| 2093 | + success: true, |
| 2094 | + errors: [], |
| 2095 | + messages: [], |
| 2096 | + result: { |
| 2097 | + started_on: "01-01-2001", |
| 2098 | + complete: false, |
| 2099 | + }, |
| 2100 | + }); |
| 2101 | + }, |
| 2102 | + { once: true } |
| 2103 | + ) |
| 2104 | + ); |
| 2105 | + return requests; |
| 2106 | + } |
| 2107 | + function mockGetQueueRequest(queueName: string) { |
| 2108 | + const requests = { count: 0 }; |
| 2109 | + msw.use( |
| 2110 | + http.get( |
| 2111 | + "*/accounts/:accountId/queues?*", |
| 2112 | + async () => { |
| 2113 | + requests.count += 1; |
| 2114 | + return HttpResponse.json({ |
| 2115 | + success: true, |
| 2116 | + errors: [], |
| 2117 | + messages: [], |
| 2118 | + result: [ |
| 2119 | + { |
| 2120 | + queue_name: queueName, |
| 2121 | + created_on: "", |
| 2122 | + producers: [], |
| 2123 | + consumers: [], |
| 2124 | + producers_total_count: 1, |
| 2125 | + consumers_total_count: 0, |
| 2126 | + modified_on: "", |
| 2127 | + queue_id: "queueId", |
| 2128 | + }, |
| 2129 | + ], |
| 2130 | + }); |
| 2131 | + }, |
| 2132 | + { once: true } |
| 2133 | + ) |
| 2134 | + ); |
| 2135 | + return requests; |
| 2136 | + } |
| 2137 | + |
| 2138 | + it("should show the correct help text", async () => { |
| 2139 | + await runWrangler("queues purge --help"); |
| 2140 | + expect(std.err).toMatchInlineSnapshot(`""`); |
| 2141 | + expect(std.out).toMatchInlineSnapshot(` |
| 2142 | + "wrangler queues purge <name> |
| 2143 | +
|
| 2144 | + Purge messages from a Queue |
| 2145 | +
|
| 2146 | + POSITIONALS |
| 2147 | + name The name of the queue [string] [required] |
| 2148 | +
|
| 2149 | + GLOBAL FLAGS |
| 2150 | + -c, --config Path to Wrangler configuration file [string] |
| 2151 | + --cwd Run as if Wrangler was started in the specified directory instead of the current working directory [string] |
| 2152 | + -e, --env Environment to use for operations, and for selecting .env and .dev.vars files [string] |
| 2153 | + -h, --help Show help [boolean] |
| 2154 | + -v, --version Show version number [boolean] |
| 2155 | +
|
| 2156 | + OPTIONS |
| 2157 | + --force Skip the confirmation dialog and forcefully purge the Queue [boolean]" |
| 2158 | + `); |
| 2159 | + }); |
| 2160 | + |
| 2161 | + it("rejects a missing --force flag in non-interactive mode", async () => { |
| 2162 | + const getrequests = mockGetQueueRequest("testQueue"); |
| 2163 | + const requests = mockPurgeRequest(); |
| 2164 | + |
| 2165 | + await expect( |
| 2166 | + runWrangler("queues purge testQueue") |
| 2167 | + ).rejects.toThrowErrorMatchingInlineSnapshot( |
| 2168 | + `[Error: The --force flag is required to purge a Queue in non-interactive mode]` |
| 2169 | + ); |
| 2170 | + |
| 2171 | + expect(requests.count).toEqual(0); |
| 2172 | + expect(getrequests.count).toEqual(0); |
| 2173 | + |
| 2174 | + expect(std.out).toMatchInlineSnapshot(`""`); |
| 2175 | + }); |
| 2176 | + |
| 2177 | + it("allows purge with the --force flag in non-interactive mode", async () => { |
| 2178 | + const getrequests = mockGetQueueRequest("testQueue"); |
| 2179 | + const requests = mockPurgeRequest(); |
| 2180 | + |
| 2181 | + await runWrangler("queues purge testQueue --force"); |
| 2182 | + |
| 2183 | + expect(requests.count).toEqual(1); |
| 2184 | + expect(getrequests.count).toEqual(1); |
| 2185 | + |
| 2186 | + expect(std.out).toMatchInlineSnapshot(`"Purged Queue 'testQueue'"`); |
| 2187 | + }); |
| 2188 | + |
| 2189 | + it("allows purge with the --force flag in non-interactive mode", async () => { |
| 2190 | + const getrequests = mockGetQueueRequest("testQueue"); |
| 2191 | + const requests = mockPurgeRequest(); |
| 2192 | + |
| 2193 | + await runWrangler("queues purge testQueue --force"); |
| 2194 | + |
| 2195 | + expect(requests.count).toEqual(1); |
| 2196 | + expect(getrequests.count).toEqual(1); |
| 2197 | + |
| 2198 | + expect(std.out).toMatchInlineSnapshot(`"Purged Queue 'testQueue'"`); |
| 2199 | + }); |
| 2200 | + |
| 2201 | + it("allows purge with the --force flag in interactive mode", async () => { |
| 2202 | + setIsTTY(true); |
| 2203 | + const getrequests = mockGetQueueRequest("testQueue"); |
| 2204 | + const requests = mockPurgeRequest(); |
| 2205 | + await runWrangler("queues purge testQueue --force"); |
| 2206 | + |
| 2207 | + expect(requests.count).toEqual(1); |
| 2208 | + expect(getrequests.count).toEqual(1); |
| 2209 | + |
| 2210 | + expect(std.out).toMatchInlineSnapshot(`"Purged Queue 'testQueue'"`); |
| 2211 | + }); |
| 2212 | + |
| 2213 | + it("rejects invalid confirmation in interactive mode", async () => { |
| 2214 | + setIsTTY(true); |
| 2215 | + const getrequests = mockGetQueueRequest("testQueue"); |
| 2216 | + const requests = mockPurgeRequest(); |
| 2217 | + mockPrompt({ |
| 2218 | + text: "This operation will permanently delete all the messages in Queue testQueue. Type testQueue to proceed.", |
| 2219 | + result: "wrong-name", |
| 2220 | + }); |
| 2221 | + await expect( |
| 2222 | + runWrangler("queues purge testQueue") |
| 2223 | + ).rejects.toThrowErrorMatchingInlineSnapshot( |
| 2224 | + `[Error: Incorrect queue name provided. Skipping purge operation]` |
| 2225 | + ); |
| 2226 | + |
| 2227 | + expect(requests.count).toEqual(0); |
| 2228 | + expect(getrequests.count).toEqual(0); |
| 2229 | + |
| 2230 | + expect(std.out).toMatchInlineSnapshot(`""`); |
| 2231 | + }); |
| 2232 | + |
| 2233 | + it("allows purge with correct confirmation in interactive mode", async () => { |
| 2234 | + setIsTTY(true); |
| 2235 | + const getrequests = mockGetQueueRequest("testQueue"); |
| 2236 | + const requests = mockPurgeRequest(); |
| 2237 | + mockPrompt({ |
| 2238 | + text: "This operation will permanently delete all the messages in Queue testQueue. Type testQueue to proceed.", |
| 2239 | + result: "testQueue", |
| 2240 | + }); |
| 2241 | + await runWrangler("queues purge testQueue"); |
| 2242 | + |
| 2243 | + expect(requests.count).toEqual(1); |
| 2244 | + expect(getrequests.count).toEqual(1); |
| 2245 | + |
| 2246 | + expect(std.out).toMatchInlineSnapshot(`"Purged Queue 'testQueue'"`); |
| 2247 | + }); |
| 2248 | + }); |
2069 | 2249 | });
|
0 commit comments