diff --git a/lib/playwright/api_request.ex b/lib/playwright/api_request.ex index 5a958a5..28e0f6e 100644 --- a/lib/playwright/api_request.ex +++ b/lib/playwright/api_request.ex @@ -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] @@ -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 diff --git a/lib/playwright/api_request_context.ex b/lib/playwright/api_request_context.ex index e29d740..1e54be0 100644 --- a/lib/playwright/api_request_context.ex +++ b/lib/playwright/api_request_context.ex @@ -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 # --- diff --git a/lib/playwright/api_response.ex b/lib/playwright/api_response.ex index a71de72..552fcb4 100644 --- a/lib/playwright/api_response.ex +++ b/lib/playwright/api_response.ex @@ -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] @@ -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} -> diff --git a/test/api/api_request_context_test.exs b/test/api/api_request_context_test.exs index 175071a..1528cb7 100644 --- a/test/api/api_request_context_test.exs +++ b/test/api/api_request_context_test.exs @@ -1,18 +1,25 @@ 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 @@ -20,8 +27,8 @@ defmodule Playwright.APIRequestContextTest 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)) @@ -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 diff --git a/test/api/api_response_test.exs b/test/api/api_response_test.exs index 48793b9..699e3cd 100644 --- a/test/api/api_response_test.exs +++ b/test/api/api_response_test.exs @@ -1,7 +1,7 @@ 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 @@ -9,7 +9,7 @@ defmodule Playwright.APIResponseTest 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