diff --git a/lib/unleash/variant.ex b/lib/unleash/variant.ex index dc193bc..04608c7 100644 --- a/lib/unleash/variant.ex +++ b/lib/unleash/variant.ex @@ -18,24 +18,12 @@ defmodule Unleash.Variant do optional(:payload) => map() } - def select_variant(%Feature{variants: variants, name: name}, context) + def select_variant(%Feature{variants: variants} = feature, context) when is_list(variants) and length(variants) > 0 do - total_weight = - variants - |> Enum.map(fn %{weight: w} -> w end) - |> Enum.sum() - - variants - |> find_override(context) - |> case do - nil -> - variants - |> find_variant(Utils.normalize(get_seed(context), name, total_weight)) - - v -> - v + case Feature.enabled?(feature, context) do + true -> variants(feature, context) + _ -> disabled() end - |> to_map(true) end def from_map(map) when is_map(map) do @@ -100,4 +88,32 @@ defmodule Unleash.Variant do defp get_context_name("userId"), do: :user_id defp get_context_name("sessionId"), do: :session_id defp get_context_name("remoteAddress"), do: :remote_address + + defp disabled do + %{ + enabled: false, + name: "disabled", + payload: %{} + } + end + + defp variants(%Feature{variants: variants, name: name}, context) + when is_list(variants) and length(variants) > 0 do + total_weight = + variants + |> Enum.map(fn %{weight: w} -> w end) + |> Enum.sum() + + variants + |> find_override(context) + |> case do + nil -> + variants + |> find_variant(Utils.normalize(get_seed(context), name, total_weight)) + + v -> + v + end + |> to_map(true) + end end diff --git a/test/unleash/variant_test.exs b/test/unleash/variant_test.exs new file mode 100644 index 0000000..f1a5b87 --- /dev/null +++ b/test/unleash/variant_test.exs @@ -0,0 +1,47 @@ +defmodule Unleash.VariantTest do + use ExUnit.Case + + setup :start_repo + + test "return a disabled variant if the flag is disabled" do + assert %{ + enabled: false, + name: "disabled", + payload: %{} + } == Unleash.get_variant(:disabled_variant) + end + + defp start_repo(_) do + stop_supervised(Unleash.Repo) + + state = Unleash.Features.from_map!(state()) + + {:ok, _pid} = start_supervised({Unleash.Repo, state}) + :ok + end + + defp state, + do: %{ + "version" => 1, + "features" => [ + %{ + "name" => "disabled_variant", + "description" => "variant with enabled set to false", + "enabled" => false, + "strategies" => [ + %{ + "name" => "default", + "parameters" => %{} + } + ], + "variants" => [ + %{ + "name" => "variant1", + "weight" => 100, + "payload" => %{"type" => "string", "value" => "val1"} + } + ] + } + ] + } +end diff --git a/test/unleash_test.exs b/test/unleash_test.exs index a66de2e..5439ed2 100644 --- a/test/unleash_test.exs +++ b/test/unleash_test.exs @@ -193,7 +193,7 @@ defmodule UnleashTest do "name" => "variant", "description" => "variant", "enabled" => true, - "startegies" => [ + "strategies" => [ %{ "name" => "default", "parameters" => %{}