Skip to content

Commit

Permalink
API: impl APIRequestContext.dispose/2
Browse files Browse the repository at this point in the history
  • Loading branch information
coreyti committed Oct 3, 2024
1 parent 054781c commit b534146
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 22 deletions.
3 changes: 2 additions & 1 deletion lib/playwright/api_request.ex
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ defmodule Playwright.APIRequest do
use Playwright.SDK.Pipeline
alias Playwright.API.Error
alias Playwright.APIRequest
alias Playwright.APIRequestContext
alias Playwright.SDK.Channel

@enforce_keys [:guid, :session]
Expand Down Expand Up @@ -276,7 +277,7 @@ defmodule Playwright.APIRequest do
"""
@pipe {:new_context, [:request]}
@pipe {:new_context, [:request, :options]}
@spec new_context(t(), options()) :: t() | {:error, Error.t()}
@spec new_context(t(), options()) :: APIRequestContext.t() | {:error, Error.t()}
def new_context(%APIRequest{} = request, options \\ %{}) do
Channel.post({request, :new_request}, options)
end
Expand Down
35 changes: 33 additions & 2 deletions lib/playwright/api_request_context.ex
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,39 @@ defmodule Playwright.APIRequestContext do
fetch(context, url, Map.merge(options, %{method: "DELETE"}))
end

# @spec dispose(t()) :: t()
# def dispose(api_request_context)
@doc """
Disposes of resources related to this `Playwright.APIRequestContext`.
All responses returned by `Playwright.APIRequestContext.fetch/3` and similar
are stored in memory in order to support later, cached calls to
`Playwright.APIResponse.body/1`, etc. `dispose/1` discards all associated
resources. Subsequent calls to any function on disposed `APIRequestContext`
will result in errors.
## Arguments
| name | | description |
| ---------------- | ---------- | --------------------------------- |
| `context` | | The "subject" `APIRequestContext` |
| `reason` | (optional) | The reason to be reported to any operations interrupted by the context disposal. |
## Returns
- `:ok`
- `{:error, %Error{}}`
"""
@spec dispose(t(), String.t()) :: :ok
def dispose(context, reason \\ nil)

def dispose(%APIRequestContext{} = context, reason) do
case Channel.post({context, "dispose"}, %{reason: reason}, %{refresh: false}) do
{:error, %Playwright.API.Error{} = error} ->
{:error, error}

_ ->
:ok
end
end

# ---

Expand Down
4 changes: 2 additions & 2 deletions lib/playwright/api_response.ex
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ defmodule Playwright.APIResponse do
"""

alias Playwright.APIRequestContext
alias Playwright.SDK.Channel
alias Playwright.APIResponse
alias Playwright.API.Error
alias Playwright.SDK.Channel

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

Expand Down Expand Up @@ -77,7 +77,7 @@ defmodule Playwright.APIResponse do
- `:ok`
- `{:error, %Error{}}`
"""
@spec dispose(t()) :: :ok
@spec dispose(t()) :: :ok | {:error, Error.t()}
def dispose(%APIResponse{} = response) do
case Channel.post({response.context, "disposeAPIResponse"}, %{fetch_uid: response.fetchUid}) do
{:error, %Playwright.API.Error{} = error} ->
Expand Down
37 changes: 22 additions & 15 deletions test/api/api_request_context_test.exs
Original file line number Diff line number Diff line change
@@ -1,27 +1,34 @@
defmodule Playwright.APIRequestContextTest do
use Playwright.TestCase, async: true
alias Playwright.APIResponse
alias Playwright.APIRequest
alias Playwright.APIResponse
alias Playwright.APIRequestContext

describe "APIRequestContext.delete/3" do
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
request = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.delete(request, assets.prefix <> "/simple.json")
context = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.delete(context, assets.prefix <> "/simple.json")
assert APIResponse.ok(response)
end
end

describe "APIRequestContext.dispose/2" do
test "on success, invalidates subsequent use related `APIResponse`", %{assets: assets, session: session} do
context = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.fetch(context, assets.prefix <> "/simple.json")

assert :ok = APIRequestContext.dispose(context)
assert {:error, %{type: "TargetClosedError"}} = APIResponse.body(response)
end
end

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

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

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

describe "APIRequestContext.get/3" do
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
request = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.get(request, assets.prefix <> "/simple.json")
context = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.get(context, assets.prefix <> "/simple.json")
assert APIResponse.ok(response)
end
end

describe "APIRequestContext.head/3" do
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
request = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.head(request, assets.prefix <> "/simple.json")
context = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.head(context, assets.prefix <> "/simple.json")
assert APIResponse.ok(response)
end
end

describe "APIRequestContext.patch/3" do
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
request = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.patch(request, assets.prefix <> "/simple.json")
context = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.patch(context, assets.prefix <> "/simple.json")
assert APIResponse.ok(response)
end
end

describe "APIRequestContext.post/3" do
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
request = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.post(request, assets.prefix <> "/simple.json")
context = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.post(context, assets.prefix <> "/simple.json")
assert APIResponse.ok(response)
end
end

describe "APIRequestContext.put/3" do
test "on success, returns `APIResponse`", %{assets: assets, session: session} do
request = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.put(request, assets.prefix <> "/simple.json")
context = Playwright.request(session) |> APIRequest.new_context()
response = APIRequestContext.put(context, assets.prefix <> "/simple.json")
assert APIResponse.ok(response)
end
end
Expand Down
4 changes: 2 additions & 2 deletions test/api/api_response_test.exs
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
defmodule Playwright.APIResponseTest do
use Playwright.TestCase, async: true
alias Playwright.APIResponse
alias Playwright.APIRequest
alias Playwright.APIResponse
alias Playwright.APIRequestContext

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

APIResponse.dispose(response)
assert :ok = APIResponse.dispose(response)
assert {:error, %{type: "ResponseError", message: "Response has been disposed"}} = APIResponse.body(response)
end
end
Expand Down

0 comments on commit b534146

Please sign in to comment.