From 4d809ec0d6e9ca6ceb081caa4ba08edc9e6cb5d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Mon, 13 Nov 2023 14:33:25 +0100 Subject: [PATCH] Move APIs used by Hubs to Livebook.Hubs.Team (#2339) --- lib/livebook/hubs/team.ex | 102 ++++++++-- lib/livebook/teams.ex | 119 +----------- lib/livebook/teams/requests.ex | 19 ++ test/livebook_teams/hubs/team_client_test.exs | 20 +- test/livebook_teams/hubs_test.exs | 178 +++++++++++++++++- test/livebook_teams/teams/connection_test.exs | 4 +- test/livebook_teams/teams_test.exs | 160 ---------------- test/livebook_teams/web/session_live_test.exs | 4 +- 8 files changed, 294 insertions(+), 312 deletions(-) diff --git a/lib/livebook/hubs/team.ex b/lib/livebook/hubs/team.ex index e550affe5..95cb02908 100644 --- a/lib/livebook/hubs/team.ex +++ b/lib/livebook/hubs/team.ex @@ -102,10 +102,12 @@ defmodule Livebook.Hubs.Team do end defimpl Livebook.Hubs.Provider, for: Livebook.Hubs.Team do - alias Livebook.Hubs.TeamClient - alias Livebook.Teams + alias Livebook.Hubs.{Team, TeamClient} + alias Livebook.Teams.Requests + alias Livebook.FileSystem + alias Livebook.Secrets.Secret - @teams_key_prefix Teams.Org.teams_key_prefix() + @teams_key_prefix Livebook.Teams.Org.teams_key_prefix() @public_key_prefix Livebook.Hubs.Team.public_key_prefix() def load(team, fields) do @@ -137,14 +139,6 @@ defimpl Livebook.Hubs.Provider, for: Livebook.Hubs.Team do def disconnect(team), do: TeamClient.stop(team.id) - def get_secrets(team), do: TeamClient.get_secrets(team.id) - - def create_secret(team, secret), do: Teams.create_secret(team, secret) - - def update_secret(team, secret), do: Teams.update_secret(team, secret) - - def delete_secret(team, secret), do: Teams.delete_secret(team, secret) - def connection_error(team) do cond do team.offline -> @@ -209,13 +203,89 @@ defimpl Livebook.Hubs.Provider, for: Livebook.Hubs.Team do |> Map.put(:offline?, team.offline != nil) end - def get_file_systems(team) do - TeamClient.get_file_systems(team.id) + def get_secrets(team), do: TeamClient.get_secrets(team.id) + + @spec create_secret(Team.t(), Secret.t()) :: + :ok + | {:error, Ecto.Changeset.t()} + | {:transport_error, String.t()} + def create_secret(%Team{} = team, %Secret{} = secret) do + case Requests.create_secret(team, secret) do + {:ok, %{"id" => _}} -> :ok + {:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)} + any -> any + end end - def create_file_system(team, file_system), do: Teams.create_file_system(team, file_system) + @spec update_secret(Team.t(), Secret.t()) :: + :ok + | {:error, Ecto.Changeset.t()} + | {:transport_error, String.t()} + def update_secret(%Team{} = team, %Secret{} = secret) do + case Requests.update_secret(team, secret) do + {:ok, %{"id" => _}} -> :ok + {:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)} + any -> any + end + end - def update_file_system(team, file_system), do: Teams.update_file_system(team, file_system) + @spec delete_secret(Team.t(), Secret.t()) :: + :ok + | {:error, Ecto.Changeset.t()} + | {:transport_error, String.t()} + def delete_secret(%Team{} = team, %Secret{} = secret) do + case Requests.delete_secret(team, secret) do + {:ok, _} -> :ok + {:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)} + any -> any + end + end - def delete_file_system(team, file_system), do: Teams.delete_file_system(team, file_system) + def get_file_systems(team), do: TeamClient.get_file_systems(team.id) + + @spec create_file_system(Team.t(), FileSystem.t()) :: + :ok + | {:error, Ecto.Changeset.t()} + | {:transport_error, String.t()} + def create_file_system(%Team{} = team, file_system) do + case Requests.create_file_system(team, file_system) do + {:ok, %{"id" => _}} -> :ok + {:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)} + any -> any + end + end + + @spec update_file_system(Team.t(), FileSystem.t()) :: + :ok + | {:error, Ecto.Changeset.t()} + | {:transport_error, String.t()} + def update_file_system(%Team{} = team, file_system) do + case Requests.update_file_system(team, file_system) do + {:ok, %{"id" => _}} -> :ok + {:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)} + any -> any + end + end + + @spec delete_file_system(Team.t(), FileSystem.t()) :: + :ok + | {:error, Ecto.Changeset.t()} + | {:transport_error, String.t()} + def delete_file_system(%Team{} = team, file_system) do + case Requests.delete_file_system(team, file_system) do + {:ok, _} -> :ok + {:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)} + any -> any + end + end + + defp add_secret_errors(%Secret{} = secret, errors_map) do + Requests.add_errors(secret, errors_map) + end + + defp add_file_system_errors(file_system, errors_map) do + %{error_field: field} = FileSystem.external_metadata(file_system) + errors_map = Map.new(errors_map, fn {_key, values} -> {field, values} end) + Requests.add_errors(file_system, errors_map) + end end diff --git a/lib/livebook/teams.ex b/lib/livebook/teams.ex index bd1cac396..7f2b49d20 100644 --- a/lib/livebook/teams.ex +++ b/lib/livebook/teams.ex @@ -1,11 +1,12 @@ defmodule Livebook.Teams do - alias Livebook.{FileSystem, Hubs} + # This is the Livebook Teams interface which is not part of Hubs. + + alias Livebook.Hubs alias Livebook.Hubs.Team - alias Livebook.Secrets.Secret alias Livebook.Teams.{Requests, Org} import Ecto.Changeset, - only: [add_error: 3, apply_action: 2, apply_action!: 2, get_field: 2, change: 1] + only: [add_error: 3, apply_action: 2, apply_action!: 2, get_field: 2] @prefix Org.teams_key_prefix() @@ -97,96 +98,6 @@ defmodule Livebook.Teams do end end - @doc """ - Creates a Secret. - """ - @spec create_secret(Team.t(), Secret.t()) :: - :ok - | {:error, Ecto.Changeset.t()} - | {:transport_error, String.t()} - def create_secret(%Team{} = team, %Secret{} = secret) do - case Requests.create_secret(team, secret) do - {:ok, %{"id" => _}} -> :ok - {:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)} - any -> any - end - end - - @doc """ - Updates a Secret. - """ - @spec update_secret(Team.t(), Secret.t()) :: - :ok - | {:error, Ecto.Changeset.t()} - | {:transport_error, String.t()} - def update_secret(%Team{} = team, %Secret{} = secret) do - case Requests.update_secret(team, secret) do - {:ok, %{"id" => _}} -> :ok - {:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)} - any -> any - end - end - - @doc """ - Deletes a Secret. - """ - @spec delete_secret(Team.t(), Secret.t()) :: - :ok - | {:error, Ecto.Changeset.t()} - | {:transport_error, String.t()} - def delete_secret(%Team{} = team, %Secret{} = secret) do - case Requests.delete_secret(team, secret) do - {:ok, _} -> :ok - {:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)} - any -> any - end - end - - @doc """ - Creates a File System. - """ - @spec create_file_system(Team.t(), FileSystem.t()) :: - :ok - | {:error, Ecto.Changeset.t()} - | {:transport_error, String.t()} - def create_file_system(%Team{} = team, file_system) do - case Requests.create_file_system(team, file_system) do - {:ok, %{"id" => _}} -> :ok - {:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)} - any -> any - end - end - - @doc """ - Updates a File System. - """ - @spec update_file_system(Team.t(), FileSystem.t()) :: - :ok - | {:error, Ecto.Changeset.t()} - | {:transport_error, String.t()} - def update_file_system(%Team{} = team, file_system) do - case Requests.update_file_system(team, file_system) do - {:ok, %{"id" => _}} -> :ok - {:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)} - any -> any - end - end - - @doc """ - Deletes a File System. - """ - @spec delete_file_system(Team.t(), FileSystem.t()) :: - :ok - | {:error, Ecto.Changeset.t()} - | {:transport_error, String.t()} - def delete_file_system(%Team{} = team, file_system) do - case Requests.delete_file_system(team, file_system) do - {:ok, _} -> :ok - {:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)} - any -> any - end - end - @doc """ Returns an `%Ecto.Changeset{}` for tracking hub changes. """ @@ -258,26 +169,6 @@ defmodule Livebook.Teams do end defp add_org_errors(%Ecto.Changeset{} = changeset, errors_map) do - add_errors(changeset, Org.__schema__(:fields), errors_map) - end - - defp add_secret_errors(%Secret{} = secret, errors_map) do - add_errors(change(secret), Secret.__schema__(:fields), errors_map) - end - - defp add_file_system_errors(%struct{} = file_system, errors_map) do - %{error_field: field} = FileSystem.external_metadata(file_system) - errors_map = Map.new(errors_map, fn {_key, values} -> {field, values} end) - - add_errors(change(file_system), struct.__schema__(:fields), errors_map) - end - - defp add_errors(%Ecto.Changeset{} = changeset, fields, errors_map) do - for {key, errors} <- errors_map, - field = String.to_atom(key), - field in fields, - error <- errors, - reduce: changeset, - do: (acc -> add_error(acc, field, error)) + Requests.add_errors(changeset, Org.__schema__(:fields), errors_map) end end diff --git a/lib/livebook/teams/requests.ex b/lib/livebook/teams/requests.ex index 6d45f8c47..9e584b670 100644 --- a/lib/livebook/teams/requests.ex +++ b/lib/livebook/teams/requests.ex @@ -145,6 +145,25 @@ defmodule Livebook.Teams.Requests do delete("/api/v1/org/file-systems", params, headers) end + @doc """ + Add requests errors to a `changeset` for the given `fields`. + """ + def add_errors(%Ecto.Changeset{} = changeset, fields, errors_map) do + for {key, errors} <- errors_map, + field = String.to_atom(key), + field in fields, + error <- errors, + reduce: changeset, + do: (acc -> Ecto.Changeset.add_error(acc, field, error)) + end + + @doc """ + Add requests errors to a struct. + """ + def add_errors(%struct{} = value, errors_map) do + value |> Ecto.Changeset.change() |> add_errors(struct.__schema__(:fields), errors_map) + end + defp auth_headers(team) do token = "#{team.user_id}:#{team.org_id}:#{team.org_key_id}:#{team.session_token}" diff --git a/test/livebook_teams/hubs/team_client_test.exs b/test/livebook_teams/hubs/team_client_test.exs index 316e8f502..9278eb4d2 100644 --- a/test/livebook_teams/hubs/team_client_test.exs +++ b/test/livebook_teams/hubs/team_client_test.exs @@ -52,7 +52,7 @@ defmodule Livebook.Hubs.TeamClientTest do assert_receive {:hub_connected, ^id} secret = build(:secret, name: "SECRET_CREATED_FOO", value: "BAR") - assert Livebook.Teams.create_secret(team, secret) == :ok + assert Livebook.Hubs.create_secret(team, secret) == :ok name = secret.name value = secret.value @@ -69,7 +69,7 @@ defmodule Livebook.Hubs.TeamClientTest do assert_receive {:hub_connected, ^id} secret = build(:secret, name: "SECRET_UPDATED_FOO", value: "BAR") - assert Livebook.Teams.create_secret(team, secret) == :ok + assert Livebook.Hubs.create_secret(team, secret) == :ok name = secret.name value = secret.value @@ -79,7 +79,7 @@ defmodule Livebook.Hubs.TeamClientTest do # updates the secret update_secret = Map.replace!(secret, :value, "BAZ") - assert Livebook.Teams.update_secret(team, update_secret) == :ok + assert Livebook.Hubs.update_secret(team, update_secret) == :ok new_value = update_secret.value @@ -95,7 +95,7 @@ defmodule Livebook.Hubs.TeamClientTest do assert_receive {:hub_connected, ^id} secret = build(:secret, name: "SECRET_DELETED_FOO", value: "BAR") - assert Livebook.Teams.create_secret(team, secret) == :ok + assert Livebook.Hubs.create_secret(team, secret) == :ok name = secret.name value = secret.value @@ -104,7 +104,7 @@ defmodule Livebook.Hubs.TeamClientTest do assert_receive {:secret_created, %{name: ^name, value: ^value}} # deletes the secret - assert Livebook.Teams.delete_secret(team, secret) == :ok + assert Livebook.Hubs.delete_secret(team, secret) == :ok # receives `{:secret_deleted, secret_deleted}` event assert_receive {:secret_deleted, %{name: ^name, value: ^value}} @@ -117,7 +117,7 @@ defmodule Livebook.Hubs.TeamClientTest do assert_receive {:hub_connected, ^id} file_system = build(:fs_s3, bucket_url: "https://file_system_created.s3.amazonaws.com") - assert Livebook.Teams.create_file_system(team, file_system) == :ok + assert Livebook.Hubs.create_file_system(team, file_system) == :ok bucket_url = file_system.bucket_url @@ -137,7 +137,7 @@ defmodule Livebook.Hubs.TeamClientTest do region: "us-east-1" ) - assert Livebook.Teams.create_file_system(team, file_system) == :ok + assert Livebook.Hubs.create_file_system(team, file_system) == :ok bucket_url = file_system.bucket_url region = file_system.region @@ -148,7 +148,7 @@ defmodule Livebook.Hubs.TeamClientTest do # updates the file system update_file_system = %{file_system | region: "eu-central-1", external_id: id} - assert Livebook.Teams.update_file_system(team, update_file_system) == :ok + assert Livebook.Hubs.update_file_system(team, update_file_system) == :ok new_region = update_file_system.region @@ -164,7 +164,7 @@ defmodule Livebook.Hubs.TeamClientTest do assert_receive {:hub_connected, ^id} file_system = build(:fs_s3, bucket_url: "https://file_system_deleted.s3.amazonaws.com") - assert Livebook.Teams.create_file_system(team, file_system) == :ok + assert Livebook.Hubs.create_file_system(team, file_system) == :ok bucket_url = file_system.bucket_url @@ -173,7 +173,7 @@ defmodule Livebook.Hubs.TeamClientTest do # deletes the file system delete_file_system = %{file_system | external_id: id} - assert Livebook.Teams.delete_file_system(team, delete_file_system) == :ok + assert Livebook.Hubs.delete_file_system(team, delete_file_system) == :ok # receives `{:file_system_deleted, file_system_deleted}` event assert_receive {:file_system_deleted, %{external_id: ^id, bucket_url: ^bucket_url}} diff --git a/test/livebook_teams/hubs_test.exs b/test/livebook_teams/hubs_test.exs index 539625d60..fd73e0c1c 100644 --- a/test/livebook_teams/hubs_test.exs +++ b/test/livebook_teams/hubs_test.exs @@ -40,17 +40,179 @@ defmodule Livebook.HubsTest do assert Hubs.hub_exists?(team.id) end - test "save_hub/1 persists hub", %{user: user, node: node} do - team = build_team_hub(user, node) - Hubs.save_hub(team) + describe "save_hub/1" do + test "persists hub", %{user: user, node: node} do + team = build_team_hub(user, node) + Hubs.save_hub(team) - assert Hubs.fetch_hub!(team.id) == team + assert Hubs.fetch_hub!(team.id) == team + end + + test "updates hub", %{user: user, node: node} do + team = create_team_hub(user, node) + Hubs.save_hub(%{team | hub_emoji: "🐈"}) + + assert Hubs.fetch_hub!(team.id).hub_emoji == "🐈" + end end - test "save_hub/1 updates hub", %{user: user, node: node} do - team = create_team_hub(user, node) - Hubs.save_hub(%{team | hub_emoji: "🐈"}) + describe "create_secret/2" do + test "creates a new secret", %{user: user, node: node} do + hub = create_team_hub(user, node) + secret = build(:secret, name: "FOO", value: "BAR") - assert Hubs.fetch_hub!(team.id).hub_emoji == "🐈" + assert Hubs.create_secret(hub, secret) == :ok + + # Guarantee uniqueness + assert {:error, changeset} = Hubs.create_secret(hub, secret) + assert "has already been taken" in errors_on(changeset).name + end + + test "returns changeset errors when data is invalid", %{user: user, node: node} do + hub = create_team_hub(user, node) + secret = build(:secret, name: "LB_FOO", value: "BAR") + + assert {:error, changeset} = Hubs.create_secret(hub, secret) + assert "cannot start with the LB_ prefix" in errors_on(changeset).name + end + end + + describe "update_secret/2" do + test "updates a secret", %{user: user, node: node} do + hub = create_team_hub(user, node) + secret = build(:secret, name: "UPDATE_ME", value: "BAR") + + assert Hubs.create_secret(hub, secret) == :ok + + update_secret = Map.replace!(secret, :value, "BAZ") + assert Hubs.update_secret(hub, update_secret) == :ok + end + + test "returns changeset errors when data is invalid", %{user: user, node: node} do + hub = create_team_hub(user, node) + secret = build(:secret, name: "FIX_ME", value: "BAR") + + assert Hubs.create_secret(hub, secret) == :ok + + update_secret = Map.replace!(secret, :value, "") + + assert {:error, changeset} = Hubs.update_secret(hub, update_secret) + assert "can't be blank" in errors_on(changeset).value + end + end + + describe "delete_secret/2" do + test "deletes a secret", %{user: user, node: node} do + hub = create_team_hub(user, node) + secret = build(:secret, name: "DELETE_ME", value: "BAR") + + assert Hubs.create_secret(hub, secret) == :ok + assert Hubs.delete_secret(hub, secret) == :ok + + # Guarantee it's been removed and will return HTTP status 404 + assert Hubs.delete_secret(hub, secret) == + {:transport_error, + "Something went wrong, try again later or please file a bug if it persists"} + end + + test "returns transport errors when secret doesn't exists", %{user: user, node: node} do + hub = create_team_hub(user, node) + secret = build(:secret, name: "I_CANT_EXIST", value: "BAR") + + # Guarantee it doesn't exists and will return HTTP status 404 + assert Hubs.delete_secret(hub, secret) == + {:transport_error, + "Something went wrong, try again later or please file a bug if it persists"} + end + end + + describe "create_file_system/2" do + test "creates a new file system", %{user: user, node: node} do + hub = create_team_hub(user, node) + file_system = build(:fs_s3, bucket_url: "https://file_system_created.s3.amazonaws.com") + + assert Hubs.create_file_system(hub, file_system) == :ok + + # Guarantee uniqueness + assert {:error, changeset} = Hubs.create_file_system(hub, file_system) + assert "has already been taken" in errors_on(changeset).bucket_url + end + + test "returns changeset errors when data is invalid", %{user: user, node: node} do + hub = create_team_hub(user, node) + file_system = build(:fs_s3, bucket_url: nil) + + assert {:error, changeset} = Hubs.create_file_system(hub, file_system) + assert "can't be blank" in errors_on(changeset).bucket_url + end + end + + describe "update_file_system/2" do + test "updates a file system", %{user: user, node: node} do + hub = create_team_hub(user, node) + teams_file_system = create_teams_file_system(hub, node) + + file_system = + build(:fs_s3, + bucket_url: teams_file_system.name, + region: "us-east-1", + external_id: to_string(teams_file_system.id) + ) + + update_file_system = Map.replace!(file_system, :region, "eu-central-1") + assert Hubs.update_file_system(hub, update_file_system) == :ok + end + + test "returns changeset errors when data is invalid", %{user: user, node: node} do + hub = create_team_hub(user, node) + teams_file_system = create_teams_file_system(hub, node) + + file_system = + build(:fs_s3, + bucket_url: "https://fix_me.s3.amazonaws.com", + external_id: to_string(teams_file_system.id) + ) + + update_file_system = Map.replace!(file_system, :bucket_url, "") + + assert {:error, changeset} = Hubs.update_file_system(hub, update_file_system) + assert "can't be blank" in errors_on(changeset).bucket_url + end + end + + describe "delete_file_system/2" do + test "deletes a file system", %{user: user, node: node} do + hub = create_team_hub(user, node) + teams_file_system = create_teams_file_system(hub, node) + + file_system = + build(:fs_s3, + bucket_url: teams_file_system.name, + region: "us-east-1", + external_id: to_string(teams_file_system.id) + ) + + assert Hubs.delete_file_system(hub, file_system) == :ok + + # Guarantee it's been removed and will return HTTP status 404 + assert Hubs.delete_file_system(hub, file_system) == + {:transport_error, + "Something went wrong, try again later or please file a bug if it persists"} + end + + test "returns transport errors when file system doesn't exists", %{user: user, node: node} do + hub = create_team_hub(user, node) + + file_system = + build(:fs_s3, + bucket_url: "https://i_cant_exist.s3.amazonaws.com", + external_id: "123456789" + ) + + # Guarantee it doesn't exists and will return HTTP status 404 + assert Hubs.delete_file_system(hub, file_system) == + {:transport_error, + "Something went wrong, try again later or please file a bug if it persists"} + end end end diff --git a/test/livebook_teams/teams/connection_test.exs b/test/livebook_teams/teams/connection_test.exs index 33fb5157a..d7d8f491e 100644 --- a/test/livebook_teams/teams/connection_test.exs +++ b/test/livebook_teams/teams/connection_test.exs @@ -43,7 +43,7 @@ defmodule Livebook.Teams.ConnectionTest do # creates a new secret secret = build(:secret, name: "FOO", value: "BAR") - assert Livebook.Teams.create_secret(hub, secret) == :ok + assert Livebook.Hubs.create_secret(hub, secret) == :ok # receives `{:event, :secret_created, secret_created}` event # without decrypting the value @@ -60,7 +60,7 @@ defmodule Livebook.Teams.ConnectionTest do # creates a new file system file_system = build(:fs_s3, bucket_url: "https://file_system_created.s3.amazonaws.com") - assert Livebook.Teams.create_file_system(hub, file_system) == :ok + assert Livebook.Hubs.create_file_system(hub, file_system) == :ok type = Livebook.FileSystems.type(file_system) %{name: name} = FileSystem.external_metadata(file_system) diff --git a/test/livebook_teams/teams_test.exs b/test/livebook_teams/teams_test.exs index e7262d209..cef48cdc2 100644 --- a/test/livebook_teams/teams_test.exs +++ b/test/livebook_teams/teams_test.exs @@ -148,164 +148,4 @@ defmodule Livebook.TeamsTest do {:error, :expired} end end - - describe "create_secret/2" do - test "creates a new secret", %{user: user, node: node} do - hub = create_team_hub(user, node) - secret = build(:secret, name: "FOO", value: "BAR") - - assert Teams.create_secret(hub, secret) == :ok - - # Guarantee uniqueness - assert {:error, changeset} = Teams.create_secret(hub, secret) - assert "has already been taken" in errors_on(changeset).name - end - - test "returns changeset errors when data is invalid", %{user: user, node: node} do - hub = create_team_hub(user, node) - secret = build(:secret, name: "LB_FOO", value: "BAR") - - assert {:error, changeset} = Teams.create_secret(hub, secret) - assert "cannot start with the LB_ prefix" in errors_on(changeset).name - end - end - - describe "update_secret/2" do - test "updates a secret", %{user: user, node: node} do - hub = create_team_hub(user, node) - secret = build(:secret, name: "UPDATE_ME", value: "BAR") - - assert Teams.create_secret(hub, secret) == :ok - - update_secret = Map.replace!(secret, :value, "BAZ") - assert Teams.update_secret(hub, update_secret) == :ok - end - - test "returns changeset errors when data is invalid", %{user: user, node: node} do - hub = create_team_hub(user, node) - secret = build(:secret, name: "FIX_ME", value: "BAR") - - assert Teams.create_secret(hub, secret) == :ok - - update_secret = Map.replace!(secret, :value, "") - - assert {:error, changeset} = Teams.update_secret(hub, update_secret) - assert "can't be blank" in errors_on(changeset).value - end - end - - describe "delete_secret/2" do - test "deletes a secret", %{user: user, node: node} do - hub = create_team_hub(user, node) - secret = build(:secret, name: "DELETE_ME", value: "BAR") - - assert Teams.create_secret(hub, secret) == :ok - assert Teams.delete_secret(hub, secret) == :ok - - # Guarantee it's been removed and will return HTTP status 404 - assert Teams.delete_secret(hub, secret) == - {:transport_error, - "Something went wrong, try again later or please file a bug if it persists"} - end - - test "returns transport errors when secret doesn't exists", %{user: user, node: node} do - hub = create_team_hub(user, node) - secret = build(:secret, name: "I_CANT_EXIST", value: "BAR") - - # Guarantee it doesn't exists and will return HTTP status 404 - assert Teams.delete_secret(hub, secret) == - {:transport_error, - "Something went wrong, try again later or please file a bug if it persists"} - end - end - - describe "create_file_system/2" do - test "creates a new file system", %{user: user, node: node} do - hub = create_team_hub(user, node) - file_system = build(:fs_s3, bucket_url: "https://file_system_created.s3.amazonaws.com") - - assert Teams.create_file_system(hub, file_system) == :ok - - # Guarantee uniqueness - assert {:error, changeset} = Teams.create_file_system(hub, file_system) - assert "has already been taken" in errors_on(changeset).bucket_url - end - - test "returns changeset errors when data is invalid", %{user: user, node: node} do - hub = create_team_hub(user, node) - file_system = build(:fs_s3, bucket_url: nil) - - assert {:error, changeset} = Teams.create_file_system(hub, file_system) - assert "can't be blank" in errors_on(changeset).bucket_url - end - end - - describe "update_file_system/2" do - test "updates a file system", %{user: user, node: node} do - hub = create_team_hub(user, node) - teams_file_system = create_teams_file_system(hub, node) - - file_system = - build(:fs_s3, - bucket_url: teams_file_system.name, - region: "us-east-1", - external_id: to_string(teams_file_system.id) - ) - - update_file_system = Map.replace!(file_system, :region, "eu-central-1") - assert Teams.update_file_system(hub, update_file_system) == :ok - end - - test "returns changeset errors when data is invalid", %{user: user, node: node} do - hub = create_team_hub(user, node) - teams_file_system = create_teams_file_system(hub, node) - - file_system = - build(:fs_s3, - bucket_url: "https://fix_me.s3.amazonaws.com", - external_id: to_string(teams_file_system.id) - ) - - update_file_system = Map.replace!(file_system, :bucket_url, "") - - assert {:error, changeset} = Teams.update_file_system(hub, update_file_system) - assert "can't be blank" in errors_on(changeset).bucket_url - end - end - - describe "delete_file_system/2" do - test "deletes a file system", %{user: user, node: node} do - hub = create_team_hub(user, node) - teams_file_system = create_teams_file_system(hub, node) - - file_system = - build(:fs_s3, - bucket_url: teams_file_system.name, - region: "us-east-1", - external_id: to_string(teams_file_system.id) - ) - - assert Teams.delete_file_system(hub, file_system) == :ok - - # Guarantee it's been removed and will return HTTP status 404 - assert Teams.delete_file_system(hub, file_system) == - {:transport_error, - "Something went wrong, try again later or please file a bug if it persists"} - end - - test "returns transport errors when file system doesn't exists", %{user: user, node: node} do - hub = create_team_hub(user, node) - - file_system = - build(:fs_s3, - bucket_url: "https://i_cant_exist.s3.amazonaws.com", - external_id: "123456789" - ) - - # Guarantee it doesn't exists and will return HTTP status 404 - assert Teams.delete_file_system(hub, file_system) == - {:transport_error, - "Something went wrong, try again later or please file a bug if it persists"} - end - end end diff --git a/test/livebook_teams/web/session_live_test.exs b/test/livebook_teams/web/session_live_test.exs index 37cc0049f..426cdcd8e 100644 --- a/test/livebook_teams/web/session_live_test.exs +++ b/test/livebook_teams/web/session_live_test.exs @@ -143,7 +143,7 @@ defmodule LivebookWeb.Integration.SessionLiveTest do hub_id: team.id ) - assert Livebook.Teams.create_secret(team, secret) == :ok + assert Livebook.Hubs.create_secret(team, secret) == :ok # receives the operation event assert_receive {:operation, {:sync_hub_secrets, "__server__"}} @@ -240,7 +240,7 @@ defmodule LivebookWeb.Integration.SessionLiveTest do assert has_element?(add_secret_button) # creates the secret - assert Livebook.Teams.create_secret(team, secret) == :ok + assert Livebook.Hubs.create_secret(team, secret) == :ok # receives the operation event assert_receive {:operation, {:sync_hub_secrets, "__server__"}}