Skip to content

Commit b534146

Browse files
committed
API: impl APIRequestContext.dispose/2
1 parent 054781c commit b534146

5 files changed

+61
-22
lines changed

lib/playwright/api_request.ex

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ defmodule Playwright.APIRequest do
1212
use Playwright.SDK.Pipeline
1313
alias Playwright.API.Error
1414
alias Playwright.APIRequest
15+
alias Playwright.APIRequestContext
1516
alias Playwright.SDK.Channel
1617

1718
@enforce_keys [:guid, :session]
@@ -276,7 +277,7 @@ defmodule Playwright.APIRequest do
276277
"""
277278
@pipe {:new_context, [:request]}
278279
@pipe {:new_context, [:request, :options]}
279-
@spec new_context(t(), options()) :: t() | {:error, Error.t()}
280+
@spec new_context(t(), options()) :: APIRequestContext.t() | {:error, Error.t()}
280281
def new_context(%APIRequest{} = request, options \\ %{}) do
281282
Channel.post({request, :new_request}, options)
282283
end

lib/playwright/api_request_context.ex

+33-2
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,39 @@ defmodule Playwright.APIRequestContext do
131131
fetch(context, url, Map.merge(options, %{method: "DELETE"}))
132132
end
133133

134-
# @spec dispose(t()) :: t()
135-
# def dispose(api_request_context)
134+
@doc """
135+
Disposes of resources related to this `Playwright.APIRequestContext`.
136+
137+
All responses returned by `Playwright.APIRequestContext.fetch/3` and similar
138+
are stored in memory in order to support later, cached calls to
139+
`Playwright.APIResponse.body/1`, etc. `dispose/1` discards all associated
140+
resources. Subsequent calls to any function on disposed `APIRequestContext`
141+
will result in errors.
142+
143+
## Arguments
144+
145+
| name | | description |
146+
| ---------------- | ---------- | --------------------------------- |
147+
| `context` | | The "subject" `APIRequestContext` |
148+
| `reason` | (optional) | The reason to be reported to any operations interrupted by the context disposal. |
149+
150+
## Returns
151+
152+
- `:ok`
153+
- `{:error, %Error{}}`
154+
"""
155+
@spec dispose(t(), String.t()) :: :ok
156+
def dispose(context, reason \\ nil)
157+
158+
def dispose(%APIRequestContext{} = context, reason) do
159+
case Channel.post({context, "dispose"}, %{reason: reason}, %{refresh: false}) do
160+
{:error, %Playwright.API.Error{} = error} ->
161+
{:error, error}
162+
163+
_ ->
164+
:ok
165+
end
166+
end
136167

137168
# ---
138169

lib/playwright/api_response.ex

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ defmodule Playwright.APIResponse do
1313
"""
1414

1515
alias Playwright.APIRequestContext
16-
alias Playwright.SDK.Channel
1716
alias Playwright.APIResponse
1817
alias Playwright.API.Error
18+
alias Playwright.SDK.Channel
1919

2020
defstruct [:context, :fetchUid, :headers, :status, :statusText, :url]
2121

@@ -77,7 +77,7 @@ defmodule Playwright.APIResponse do
7777
- `:ok`
7878
- `{:error, %Error{}}`
7979
"""
80-
@spec dispose(t()) :: :ok
80+
@spec dispose(t()) :: :ok | {:error, Error.t()}
8181
def dispose(%APIResponse{} = response) do
8282
case Channel.post({response.context, "disposeAPIResponse"}, %{fetch_uid: response.fetchUid}) do
8383
{:error, %Playwright.API.Error{} = error} ->

test/api/api_request_context_test.exs

+22-15
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,34 @@
11
defmodule Playwright.APIRequestContextTest do
22
use Playwright.TestCase, async: true
3-
alias Playwright.APIResponse
43
alias Playwright.APIRequest
4+
alias Playwright.APIResponse
55
alias Playwright.APIRequestContext
66

77
describe "APIRequestContext.delete/3" do
88
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
9-
request = Playwright.request(session) |> APIRequest.new_context()
10-
response = APIRequestContext.delete(request, assets.prefix <> "/simple.json")
9+
context = Playwright.request(session) |> APIRequest.new_context()
10+
response = APIRequestContext.delete(context, assets.prefix <> "/simple.json")
1111
assert APIResponse.ok(response)
1212
end
1313
end
1414

1515
describe "APIRequestContext.dispose/2" do
16+
test "on success, invalidates subsequent use related `APIResponse`", %{assets: assets, session: session} do
17+
context = Playwright.request(session) |> APIRequest.new_context()
18+
response = APIRequestContext.fetch(context, assets.prefix <> "/simple.json")
19+
20+
assert :ok = APIRequestContext.dispose(context)
21+
assert {:error, %{type: "TargetClosedError"}} = APIResponse.body(response)
22+
end
1623
end
1724

1825
describe "APIRequestContext.fetch/3" do
1926
test "on success, returns `APIResponse` for each HTTP method", %{assets: assets, session: session} do
2027
methods = [:delete, :get, :head, :patch, :post, :put]
2128

2229
Enum.map(methods, fn method ->
23-
request = Playwright.request(session) |> APIRequest.new_context()
24-
response = APIRequestContext.fetch(request, assets.prefix <> "/simple.json", %{method: method})
30+
context = Playwright.request(session) |> APIRequest.new_context()
31+
response = APIRequestContext.fetch(context, assets.prefix <> "/simple.json", %{method: method})
2532

2633
assert APIResponse.ok(response)
2734
assert APIResponse.header(response, "x-playwright-request-method") == String.upcase(Atom.to_string(method))
@@ -42,40 +49,40 @@ defmodule Playwright.APIRequestContextTest do
4249

4350
describe "APIRequestContext.get/3" do
4451
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
45-
request = Playwright.request(session) |> APIRequest.new_context()
46-
response = APIRequestContext.get(request, assets.prefix <> "/simple.json")
52+
context = Playwright.request(session) |> APIRequest.new_context()
53+
response = APIRequestContext.get(context, assets.prefix <> "/simple.json")
4754
assert APIResponse.ok(response)
4855
end
4956
end
5057

5158
describe "APIRequestContext.head/3" do
5259
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
53-
request = Playwright.request(session) |> APIRequest.new_context()
54-
response = APIRequestContext.head(request, assets.prefix <> "/simple.json")
60+
context = Playwright.request(session) |> APIRequest.new_context()
61+
response = APIRequestContext.head(context, assets.prefix <> "/simple.json")
5562
assert APIResponse.ok(response)
5663
end
5764
end
5865

5966
describe "APIRequestContext.patch/3" do
6067
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
61-
request = Playwright.request(session) |> APIRequest.new_context()
62-
response = APIRequestContext.patch(request, assets.prefix <> "/simple.json")
68+
context = Playwright.request(session) |> APIRequest.new_context()
69+
response = APIRequestContext.patch(context, assets.prefix <> "/simple.json")
6370
assert APIResponse.ok(response)
6471
end
6572
end
6673

6774
describe "APIRequestContext.post/3" do
6875
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
69-
request = Playwright.request(session) |> APIRequest.new_context()
70-
response = APIRequestContext.post(request, assets.prefix <> "/simple.json")
76+
context = Playwright.request(session) |> APIRequest.new_context()
77+
response = APIRequestContext.post(context, assets.prefix <> "/simple.json")
7178
assert APIResponse.ok(response)
7279
end
7380
end
7481

7582
describe "APIRequestContext.put/3" do
7683
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
77-
request = Playwright.request(session) |> APIRequest.new_context()
78-
response = APIRequestContext.put(request, assets.prefix <> "/simple.json")
84+
context = Playwright.request(session) |> APIRequest.new_context()
85+
response = APIRequestContext.put(context, assets.prefix <> "/simple.json")
7986
assert APIResponse.ok(response)
8087
end
8188
end

test/api/api_response_test.exs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
defmodule Playwright.APIResponseTest do
22
use Playwright.TestCase, async: true
3-
alias Playwright.APIResponse
43
alias Playwright.APIRequest
4+
alias Playwright.APIResponse
55
alias Playwright.APIRequestContext
66

77
describe "APIResponse.dispose/" do
88
test "on success, causes subsequent usage of `APIResponse` to fail", %{assets: assets, session: session} do
99
request = Playwright.request(session) |> APIRequest.new_context()
1010
response = APIRequestContext.fetch(request, assets.prefix <> "/simple.json")
1111

12-
APIResponse.dispose(response)
12+
assert :ok = APIResponse.dispose(response)
1313
assert {:error, %{type: "ResponseError", message: "Response has been disposed"}} = APIResponse.body(response)
1414
end
1515
end

0 commit comments

Comments
 (0)