remove all n+1 queries for real this time

This commit is contained in:
shibao 2023-03-19 15:05:09 -04:00
parent 071eb1b3c9
commit 03f8a2e8a7
24 changed files with 240 additions and 131 deletions

View File

@ -4,6 +4,7 @@
- Only show historical ammo type information when displaying "Show used" in table - Only show historical ammo type information when displaying "Show used" in table
- Only show historical ammo group information when displaying "Show used" in table - Only show historical ammo group information when displaying "Show used" in table
- Fix some values not being sorted in tables properly - Fix some values not being sorted in tables properly
- Code quality improvements
# v0.8.5 # v0.8.5
- Add link in readme to github mirror - Add link in readme to github mirror

View File

@ -843,12 +843,39 @@ defmodule Cannery.Ammo do
""" """
@spec get_percentage_remaining(AmmoGroup.t(), User.t()) :: non_neg_integer() @spec get_percentage_remaining(AmmoGroup.t(), User.t()) :: non_neg_integer()
def get_percentage_remaining(%AmmoGroup{count: 0, user_id: user_id}, %User{id: user_id}) do def get_percentage_remaining(%AmmoGroup{id: ammo_group_id} = ammo_group, user) do
0 [ammo_group]
|> get_percentages_remaining(user)
|> Map.fetch!(ammo_group_id)
end end
def get_percentage_remaining(%AmmoGroup{count: count} = ammo_group, current_user) do @doc """
round(count / get_original_count(ammo_group, current_user) * 100) Calculates the percentages remaining of multiple ammo groups out of 100
## Examples
iex> get_percentages_remaining(
...> [%AmmoGroup{id: 123, count: 5, user_id: 456}],
...> %User{id: 456}
...> )
%{123 => 100}
"""
@spec get_percentages_remaining([AmmoGroup.t()], User.t()) ::
%{optional(AmmoGroup.id()) => non_neg_integer()}
def get_percentages_remaining(ammo_groups, %User{id: user_id} = user) do
original_counts = get_original_counts(ammo_groups, user)
ammo_groups
|> Map.new(fn %AmmoGroup{id: ammo_group_id, count: count, user_id: ^user_id} ->
percentage =
case count do
0 -> 0
count -> round(count / Map.fetch!(original_counts, ammo_group_id) * 100)
end
{ammo_group_id, percentage}
end)
end end
@doc """ @doc """

View File

@ -92,7 +92,7 @@ defmodule Cannery.Containers do
@doc """ @doc """
Gets a single container. Gets a single container.
Raises `Ecto.NoResultsError` if the Container does not exist. Raises `KeyError` if the Container does not exist.
## Examples ## Examples
@ -100,18 +100,37 @@ defmodule Cannery.Containers do
%Container{} %Container{}
iex> get_container!(456, %User{id: 123}) iex> get_container!(456, %User{id: 123})
** (Ecto.NoResultsError) ** (KeyError)
""" """
@spec get_container!(Container.id(), User.t()) :: Container.t() @spec get_container!(Container.id(), User.t()) :: Container.t()
def get_container!(id, %User{id: user_id}) do def get_container!(id, user) do
Repo.one!( [id]
|> get_containers(user)
|> Map.fetch!(id)
end
@doc """
Gets multiple containers.
## Examples
iex> get_containers([123], %User{id: 123})
%{123 => %Container{}}
"""
@spec get_containers([Container.id()], User.t()) :: %{optional(Container.id()) => Container.t()}
def get_containers(ids, %User{id: user_id}) do
Repo.all(
from c in Container, from c in Container,
where: c.user_id == ^user_id, where: c.user_id == ^user_id,
where: c.id == ^id, where: c.id in ^ids,
order_by: c.name, order_by: c.name,
preload: ^@container_preloads preload: ^@container_preloads,
select: {c.id, c}
) )
|> Map.new()
end end
@doc """ @doc """

View File

@ -108,14 +108,21 @@ defmodule CanneryWeb.Components.AmmoGroupTableComponent do
[%{label: gettext("Ammo type"), key: :ammo_type} | columns] [%{label: gettext("Ammo type"), key: :ammo_type} | columns]
end end
containers =
ammo_groups
|> Enum.map(fn %{container_id: container_id} -> container_id end)
|> Containers.get_containers(current_user)
extra_data = %{ extra_data = %{
current_user: current_user, current_user: current_user,
ammo_type: ammo_type, ammo_type: ammo_type,
columns: columns, columns: columns,
container: container, container: container,
containers: containers,
original_counts: Ammo.get_original_counts(ammo_groups, current_user), original_counts: Ammo.get_original_counts(ammo_groups, current_user),
cprs: Ammo.get_cprs(ammo_groups, current_user), cprs: Ammo.get_cprs(ammo_groups, current_user),
last_used_dates: ActivityLog.get_last_used_dates(ammo_groups, current_user), last_used_dates: ActivityLog.get_last_used_dates(ammo_groups, current_user),
percentages_remaining: Ammo.get_percentages_remaining(ammo_groups, current_user),
actions: actions, actions: actions,
range: range range: range
} }
@ -202,8 +209,12 @@ defmodule CanneryWeb.Components.AmmoGroupTableComponent do
"""} """}
end end
defp get_value_for_key(:remaining, ammo_group, %{current_user: current_user}) do defp get_value_for_key(
percentage = ammo_group |> Ammo.get_percentage_remaining(current_user) :remaining,
%{id: ammo_group_id},
%{percentages_remaining: percentages_remaining}
) do
percentage = Map.fetch!(percentages_remaining, ammo_group_id)
{percentage, gettext("%{percentage}%", percentage: percentage)} {percentage, gettext("%{percentage}%", percentage: percentage)}
end end
@ -220,12 +231,13 @@ defmodule CanneryWeb.Components.AmmoGroupTableComponent do
defp get_value_for_key( defp get_value_for_key(
:container, :container,
%{container_id: container_id} = ammo_group, %{container_id: container_id} = ammo_group,
%{container: container, current_user: current_user} %{container: container_block, containers: containers}
) do ) do
container = %{name: container_name} = Map.fetch!(containers, container_id)
assigns = %{ assigns = %{
container: container: container,
%{name: container_name} = container_id |> Containers.get_container!(current_user), container_block: container_block,
container_block: container,
ammo_group: ammo_group ammo_group: ammo_group
} }

View File

@ -6,7 +6,7 @@ defmodule CanneryWeb.CoreComponents do
import CanneryWeb.{Gettext, ViewHelpers} import CanneryWeb.{Gettext, ViewHelpers}
alias Cannery.{Accounts, Accounts.Invite, Accounts.User} alias Cannery.{Accounts, Accounts.Invite, Accounts.User}
alias Cannery.{Ammo, Ammo.AmmoGroup} alias Cannery.{Ammo, Ammo.AmmoGroup}
alias Cannery.{Containers, Containers.Container, Containers.Tag} alias Cannery.{Containers.Container, Containers.Tag}
alias CanneryWeb.{Endpoint, HomeLive} alias CanneryWeb.{Endpoint, HomeLive}
alias CanneryWeb.Router.Helpers, as: Routes alias CanneryWeb.Router.Helpers, as: Routes
alias Phoenix.LiveView.{JS, Rendered} alias Phoenix.LiveView.{JS, Rendered}
@ -91,7 +91,7 @@ defmodule CanneryWeb.CoreComponents do
attr :original_count, :integer, default: nil attr :original_count, :integer, default: nil
attr :cpr, :integer, default: nil attr :cpr, :integer, default: nil
attr :last_used_date, Date, default: nil attr :last_used_date, Date, default: nil
attr :show_container, :boolean, default: false attr :container, Container, default: nil
slot(:inner_block) slot(:inner_block)
def ammo_group_card(assigns) def ammo_group_card(assigns)

View File

@ -50,17 +50,11 @@
<%= gettext("$%{amount}", amount: display_currency(@cpr)) %> <%= gettext("$%{amount}", amount: display_currency(@cpr)) %>
</span> </span>
<span <span :if={@container} class="rounded-lg title text-lg">
:if={@show_container && Containers.get_container!(@ammo_group.container_id, @current_user)}
class="rounded-lg title text-lg"
>
<%= gettext("Container:") %> <%= gettext("Container:") %>
<.link <.link navigate={Routes.container_show_path(Endpoint, :show, @container)} class="link">
navigate={Routes.container_show_path(Endpoint, :show, @ammo_group.container_id)} <%= @container.name %>
class="link"
>
<%= Containers.get_container!(@ammo_group.container_id, @current_user).name %>
</.link> </.link>
</span> </span>
</div> </div>

View File

@ -32,18 +32,17 @@ defmodule CanneryWeb.ExportController do
used_counts = ammo_groups |> ActivityLog.get_used_counts(current_user) used_counts = ammo_groups |> ActivityLog.get_used_counts(current_user)
original_counts = ammo_groups |> Ammo.get_original_counts(current_user) original_counts = ammo_groups |> Ammo.get_original_counts(current_user)
cprs = ammo_groups |> Ammo.get_cprs(current_user) cprs = ammo_groups |> Ammo.get_cprs(current_user)
percentages_remaining = ammo_groups |> Ammo.get_percentages_remaining(current_user)
ammo_groups = ammo_groups =
ammo_groups ammo_groups
|> Enum.map(fn %{id: ammo_group_id} = ammo_group -> |> Enum.map(fn %{id: ammo_group_id} = ammo_group ->
percentage_remaining = ammo_group |> Ammo.get_percentage_remaining(current_user)
ammo_group ammo_group
|> Jason.encode!() |> Jason.encode!()
|> Jason.decode!() |> Jason.decode!()
|> Map.merge(%{ |> Map.merge(%{
"used_count" => Map.get(used_counts, ammo_group_id), "used_count" => Map.get(used_counts, ammo_group_id),
"percentage_remaining" => percentage_remaining, "percentage_remaining" => Map.fetch!(percentages_remaining, ammo_group_id),
"original_count" => Map.get(original_counts, ammo_group_id), "original_count" => Map.get(original_counts, ammo_group_id),
"cpr" => Map.get(cprs, ammo_group_id) "cpr" => Map.get(cprs, ammo_group_id)
}) })

View File

@ -4,7 +4,7 @@ defmodule CanneryWeb.AmmoTypeLive.Show do
""" """
use CanneryWeb, :live_view use CanneryWeb, :live_view
alias Cannery.{ActivityLog, Ammo, Ammo.AmmoType} alias Cannery.{ActivityLog, Ammo, Ammo.AmmoType, Containers}
alias CanneryWeb.Endpoint alias CanneryWeb.Endpoint
@fields_list [ @fields_list [
@ -104,11 +104,17 @@ defmodule CanneryWeb.AmmoTypeLive.Show do
:edit -> gettext("Edit %{ammo_type_name}", ammo_type_name: ammo_type_name) :edit -> gettext("Edit %{ammo_type_name}", ammo_type_name: ammo_type_name)
end end
containers =
ammo_groups
|> Enum.map(fn %{container_id: container_id} -> container_id end)
|> Containers.get_containers(current_user)
socket socket
|> assign( |> assign(
page_title: page_title, page_title: page_title,
ammo_type: ammo_type, ammo_type: ammo_type,
ammo_groups: ammo_groups, ammo_groups: ammo_groups,
containers: containers,
cprs: ammo_groups |> Ammo.get_cprs(current_user), cprs: ammo_groups |> Ammo.get_cprs(current_user),
last_used_dates: ammo_groups |> ActivityLog.get_last_used_dates(current_user), last_used_dates: ammo_groups |> ActivityLog.get_last_used_dates(current_user),
avg_cost_per_round: ammo_type |> Ammo.get_average_cost_for_ammo_type(current_user), avg_cost_per_round: ammo_type |> Ammo.get_average_cost_for_ammo_type(current_user),

View File

@ -184,13 +184,13 @@
<% else %> <% else %>
<div class="flex flex-wrap justify-center items-stretch"> <div class="flex flex-wrap justify-center items-stretch">
<.ammo_group_card <.ammo_group_card
:for={%{id: ammo_group_id} = ammo_group <- @ammo_groups} :for={%{id: ammo_group_id, container_id: container_id} = ammo_group <- @ammo_groups}
ammo_group={ammo_group} ammo_group={ammo_group}
original_count={@original_counts && Map.fetch!(@original_counts, ammo_group_id)} original_count={@original_counts && Map.fetch!(@original_counts, ammo_group_id)}
cpr={Map.get(@cprs, ammo_group_id)} cpr={Map.get(@cprs, ammo_group_id)}
last_used_date={Map.get(@last_used_dates, ammo_group_id)} last_used_date={Map.get(@last_used_dates, ammo_group_id)}
current_user={@current_user} current_user={@current_user}
show_container={true} container={Map.fetch!(@containers, container_id)}
/> />
</div> </div>
<% end %> <% end %>

View File

@ -525,8 +525,8 @@ msgstr "Kein weiterer Behälter"
msgid "Shot log" msgid "Shot log"
msgstr "Schießkladde" msgstr "Schießkladde"
#: lib/cannery_web/components/ammo_group_table_component.ex:173 #: lib/cannery_web/components/ammo_group_table_component.ex:180
#: lib/cannery_web/components/ammo_group_table_component.ex:251 #: lib/cannery_web/components/ammo_group_table_component.ex:263
#: lib/cannery_web/components/ammo_type_table_component.ex:235 #: lib/cannery_web/components/ammo_type_table_component.ex:235
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50
@ -620,8 +620,8 @@ msgstr "Editiere %{name} Tags"
msgid "Rounds:" msgid "Rounds:"
msgstr "Patronen:" msgstr "Patronen:"
#: lib/cannery_web/components/ammo_group_table_component.ex:170 #: lib/cannery_web/components/ammo_group_table_component.ex:177
#: lib/cannery_web/components/ammo_group_table_component.ex:247 #: lib/cannery_web/components/ammo_group_table_component.ex:259
#: lib/cannery_web/components/ammo_type_table_component.ex:234 #: lib/cannery_web/components/ammo_type_table_component.ex:234
#: lib/cannery_web/live/ammo_type_live/show.html.heex:139 #: lib/cannery_web/live/ammo_type_live/show.html.heex:139
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -796,7 +796,7 @@ msgstr ""
msgid "Leave \"Uses left\" blank to make invite unlimited" msgid "Leave \"Uses left\" blank to make invite unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:57 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:54
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Container:" msgid "Container:"
msgstr "Behälter" msgstr "Behälter"
@ -809,7 +809,7 @@ msgstr "Behälter"
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:207 #: lib/cannery_web/components/ammo_group_table_component.ex:218
#: lib/cannery_web/live/ammo_group_live/show.html.heex:19 #: lib/cannery_web/live/ammo_group_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
@ -996,7 +996,7 @@ msgstr ""
msgid "Edit %{ammo_type_name}" msgid "Edit %{ammo_type_name}"
msgstr "%{name} bearbeiten" msgstr "%{name} bearbeiten"
#: lib/cannery_web/components/ammo_group_table_component.ex:255 #: lib/cannery_web/components/ammo_group_table_component.ex:267
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
@ -1042,7 +1042,7 @@ msgstr ""
msgid "Last used on:" msgid "Last used on:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:191 #: lib/cannery_web/components/ammo_group_table_component.ex:198
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Never used" msgid "Never used"
msgstr "" msgstr ""

View File

@ -23,7 +23,7 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:201 #: lib/cannery/containers.ex:220
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "Behälter muss vor dem Löschen leer sein" msgstr "Behälter muss vor dem Löschen leer sein"
@ -172,7 +172,7 @@ msgstr ""
"Ungültige Nummer an Kopien. Muss zwischen 1 and %{max} liegen. War " "Ungültige Nummer an Kopien. Muss zwischen 1 and %{max} liegen. War "
"%{multiplier}" "%{multiplier}"
#: lib/cannery/ammo.ex:1016 #: lib/cannery/ammo.ex:1043
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "" msgstr ""

View File

@ -519,8 +519,8 @@ msgstr ""
msgid "Shot log" msgid "Shot log"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:173 #: lib/cannery_web/components/ammo_group_table_component.ex:180
#: lib/cannery_web/components/ammo_group_table_component.ex:251 #: lib/cannery_web/components/ammo_group_table_component.ex:263
#: lib/cannery_web/components/ammo_type_table_component.ex:235 #: lib/cannery_web/components/ammo_type_table_component.ex:235
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50
@ -614,8 +614,8 @@ msgstr ""
msgid "Rounds:" msgid "Rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:170 #: lib/cannery_web/components/ammo_group_table_component.ex:177
#: lib/cannery_web/components/ammo_group_table_component.ex:247 #: lib/cannery_web/components/ammo_group_table_component.ex:259
#: lib/cannery_web/components/ammo_type_table_component.ex:234 #: lib/cannery_web/components/ammo_type_table_component.ex:234
#: lib/cannery_web/live/ammo_type_live/show.html.heex:139 #: lib/cannery_web/live/ammo_type_live/show.html.heex:139
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -790,7 +790,7 @@ msgstr ""
msgid "Leave \"Uses left\" blank to make invite unlimited" msgid "Leave \"Uses left\" blank to make invite unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:57 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container:" msgid "Container:"
msgstr "" msgstr ""
@ -803,7 +803,7 @@ msgstr ""
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:207 #: lib/cannery_web/components/ammo_group_table_component.ex:218
#: lib/cannery_web/live/ammo_group_live/show.html.heex:19 #: lib/cannery_web/live/ammo_group_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
@ -990,7 +990,7 @@ msgstr ""
msgid "Edit %{ammo_type_name}" msgid "Edit %{ammo_type_name}"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:255 #: lib/cannery_web/components/ammo_group_table_component.ex:267
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
@ -1036,7 +1036,7 @@ msgstr ""
msgid "Last used on:" msgid "Last used on:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:191 #: lib/cannery_web/components/ammo_group_table_component.ex:198
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Never used" msgid "Never used"
msgstr "" msgstr ""

View File

@ -519,8 +519,8 @@ msgstr ""
msgid "Shot log" msgid "Shot log"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:173 #: lib/cannery_web/components/ammo_group_table_component.ex:180
#: lib/cannery_web/components/ammo_group_table_component.ex:251 #: lib/cannery_web/components/ammo_group_table_component.ex:263
#: lib/cannery_web/components/ammo_type_table_component.ex:235 #: lib/cannery_web/components/ammo_type_table_component.ex:235
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50
@ -614,8 +614,8 @@ msgstr ""
msgid "Rounds:" msgid "Rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:170 #: lib/cannery_web/components/ammo_group_table_component.ex:177
#: lib/cannery_web/components/ammo_group_table_component.ex:247 #: lib/cannery_web/components/ammo_group_table_component.ex:259
#: lib/cannery_web/components/ammo_type_table_component.ex:234 #: lib/cannery_web/components/ammo_type_table_component.ex:234
#: lib/cannery_web/live/ammo_type_live/show.html.heex:139 #: lib/cannery_web/live/ammo_type_live/show.html.heex:139
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -790,7 +790,7 @@ msgstr ""
msgid "Leave \"Uses left\" blank to make invite unlimited" msgid "Leave \"Uses left\" blank to make invite unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:57 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:54
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Container:" msgid "Container:"
msgstr "" msgstr ""
@ -803,7 +803,7 @@ msgstr ""
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:207 #: lib/cannery_web/components/ammo_group_table_component.ex:218
#: lib/cannery_web/live/ammo_group_live/show.html.heex:19 #: lib/cannery_web/live/ammo_group_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
@ -990,7 +990,7 @@ msgstr ""
msgid "Edit %{ammo_type_name}" msgid "Edit %{ammo_type_name}"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:255 #: lib/cannery_web/components/ammo_group_table_component.ex:267
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
@ -1036,7 +1036,7 @@ msgstr ""
msgid "Last used on:" msgid "Last used on:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:191 #: lib/cannery_web/components/ammo_group_table_component.ex:198
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Never used" msgid "Never used"
msgstr "" msgstr ""

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Language: en\n" "Language: en\n"
#: lib/cannery/containers.ex:201 #: lib/cannery/containers.ex:220
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "" msgstr ""
@ -155,7 +155,7 @@ msgstr ""
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "" msgstr ""
#: lib/cannery/ammo.ex:1016 #: lib/cannery/ammo.ex:1043
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "" msgstr ""

View File

@ -10,7 +10,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
#: lib/cannery/containers.ex:201 #: lib/cannery/containers.ex:220
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "" msgstr ""
@ -154,7 +154,7 @@ msgstr ""
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "" msgstr ""
#: lib/cannery/ammo.ex:1016 #: lib/cannery/ammo.ex:1043
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "" msgstr ""

View File

@ -526,8 +526,8 @@ msgstr "No hay otros contenedores"
msgid "Shot log" msgid "Shot log"
msgstr "Registro de tiros" msgstr "Registro de tiros"
#: lib/cannery_web/components/ammo_group_table_component.ex:173 #: lib/cannery_web/components/ammo_group_table_component.ex:180
#: lib/cannery_web/components/ammo_group_table_component.ex:251 #: lib/cannery_web/components/ammo_group_table_component.ex:263
#: lib/cannery_web/components/ammo_type_table_component.ex:235 #: lib/cannery_web/components/ammo_type_table_component.ex:235
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50
@ -621,8 +621,8 @@ msgstr "Editar etiquetas de %{name}"
msgid "Rounds:" msgid "Rounds:"
msgstr "Balas:" msgstr "Balas:"
#: lib/cannery_web/components/ammo_group_table_component.ex:170 #: lib/cannery_web/components/ammo_group_table_component.ex:177
#: lib/cannery_web/components/ammo_group_table_component.ex:247 #: lib/cannery_web/components/ammo_group_table_component.ex:259
#: lib/cannery_web/components/ammo_type_table_component.ex:234 #: lib/cannery_web/components/ammo_type_table_component.ex:234
#: lib/cannery_web/live/ammo_type_live/show.html.heex:139 #: lib/cannery_web/live/ammo_type_live/show.html.heex:139
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -798,7 +798,7 @@ msgid "Leave \"Uses left\" blank to make invite unlimited"
msgstr "" msgstr ""
"Deje \"Usos restantes\" en blanco para hacer las invitaciónes ilimitadas" "Deje \"Usos restantes\" en blanco para hacer las invitaciónes ilimitadas"
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:57 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container:" msgid "Container:"
msgstr "Contenedor:" msgstr "Contenedor:"
@ -811,7 +811,7 @@ msgstr "Contenedor:"
msgid "Show used" msgid "Show used"
msgstr "Mostrar usadas" msgstr "Mostrar usadas"
#: lib/cannery_web/components/ammo_group_table_component.ex:207 #: lib/cannery_web/components/ammo_group_table_component.ex:218
#: lib/cannery_web/live/ammo_group_live/show.html.heex:19 #: lib/cannery_web/live/ammo_group_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
@ -998,7 +998,7 @@ msgstr ""
msgid "Edit %{ammo_type_name}" msgid "Edit %{ammo_type_name}"
msgstr "Editar %{ammo_type_name}" msgstr "Editar %{ammo_type_name}"
#: lib/cannery_web/components/ammo_group_table_component.ex:255 #: lib/cannery_web/components/ammo_group_table_component.ex:267
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
@ -1044,7 +1044,7 @@ msgstr "Usada por última vez en"
msgid "Last used on:" msgid "Last used on:"
msgstr "Usada por última vez en:" msgstr "Usada por última vez en:"
#: lib/cannery_web/components/ammo_group_table_component.ex:191 #: lib/cannery_web/components/ammo_group_table_component.ex:198
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Never used" msgid "Never used"
msgstr "Nunca usada" msgstr "Nunca usada"

View File

@ -23,7 +23,7 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:201 #: lib/cannery/containers.ex:220
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "El contenedor debe estar vacío antes de ser borrado" msgstr "El contenedor debe estar vacío antes de ser borrado"
@ -170,7 +170,7 @@ msgstr "No se ha podido procesar el número de copias"
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "Número inválido de copias, debe ser entre 1 y %{max}. Fue %{multiplier" msgstr "Número inválido de copias, debe ser entre 1 y %{max}. Fue %{multiplier"
#: lib/cannery/ammo.ex:1016 #: lib/cannery/ammo.ex:1043
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "Multiplicador inválido" msgstr "Multiplicador inválido"

View File

@ -527,8 +527,8 @@ msgstr "Aucun autre conteneur"
msgid "Shot log" msgid "Shot log"
msgstr "Évènements de tir" msgstr "Évènements de tir"
#: lib/cannery_web/components/ammo_group_table_component.ex:173 #: lib/cannery_web/components/ammo_group_table_component.ex:180
#: lib/cannery_web/components/ammo_group_table_component.ex:251 #: lib/cannery_web/components/ammo_group_table_component.ex:263
#: lib/cannery_web/components/ammo_type_table_component.ex:235 #: lib/cannery_web/components/ammo_type_table_component.ex:235
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50
@ -622,8 +622,8 @@ msgstr "Éditer les tags de %{name}"
msgid "Rounds:" msgid "Rounds:"
msgstr "Cartouches:" msgstr "Cartouches:"
#: lib/cannery_web/components/ammo_group_table_component.ex:170 #: lib/cannery_web/components/ammo_group_table_component.ex:177
#: lib/cannery_web/components/ammo_group_table_component.ex:247 #: lib/cannery_web/components/ammo_group_table_component.ex:259
#: lib/cannery_web/components/ammo_type_table_component.ex:234 #: lib/cannery_web/components/ammo_type_table_component.ex:234
#: lib/cannery_web/live/ammo_type_live/show.html.heex:139 #: lib/cannery_web/live/ammo_type_live/show.html.heex:139
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -799,7 +799,7 @@ msgid "Leave \"Uses left\" blank to make invite unlimited"
msgstr "" msgstr ""
"Laissez \"Utilisations restantes\" vide pour rendre l'invitation illimitée" "Laissez \"Utilisations restantes\" vide pour rendre l'invitation illimitée"
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:57 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:54
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Container:" msgid "Container:"
msgstr "Conteneur" msgstr "Conteneur"
@ -812,7 +812,7 @@ msgstr "Conteneur"
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:207 #: lib/cannery_web/components/ammo_group_table_component.ex:218
#: lib/cannery_web/live/ammo_group_live/show.html.heex:19 #: lib/cannery_web/live/ammo_group_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
@ -999,7 +999,7 @@ msgstr ""
msgid "Edit %{ammo_type_name}" msgid "Edit %{ammo_type_name}"
msgstr "Éditer %{name}" msgstr "Éditer %{name}"
#: lib/cannery_web/components/ammo_group_table_component.ex:255 #: lib/cannery_web/components/ammo_group_table_component.ex:267
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
@ -1045,7 +1045,7 @@ msgstr ""
msgid "Last used on:" msgid "Last used on:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:191 #: lib/cannery_web/components/ammo_group_table_component.ex:198
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Never used" msgid "Never used"
msgstr "" msgstr ""

View File

@ -23,7 +23,7 @@ msgstr ""
# # Run "mix gettext.extract" to bring this file up to # # Run "mix gettext.extract" to bring this file up to
# # date. Leave "msgstr"s empty as changing them here has no # # date. Leave "msgstr"s empty as changing them here has no
# # effect: edit them in PO (.po) files instead. # # effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:201 #: lib/cannery/containers.ex:220
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "Le conteneur doit être vide pour être supprimé" msgstr "Le conteneur doit être vide pour être supprimé"
@ -171,7 +171,7 @@ msgstr "Impossible d'analyser le nombre de copies"
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "Nombre de copies invalide, doit être 1 et %{max}. Été %{multiplier}" msgstr "Nombre de copies invalide, doit être 1 et %{max}. Été %{multiplier}"
#: lib/cannery/ammo.ex:1016 #: lib/cannery/ammo.ex:1043
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "Multiplicateur invalide" msgstr "Multiplicateur invalide"

View File

@ -521,8 +521,8 @@ msgstr ""
msgid "Shot log" msgid "Shot log"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:173 #: lib/cannery_web/components/ammo_group_table_component.ex:180
#: lib/cannery_web/components/ammo_group_table_component.ex:251 #: lib/cannery_web/components/ammo_group_table_component.ex:263
#: lib/cannery_web/components/ammo_type_table_component.ex:235 #: lib/cannery_web/components/ammo_type_table_component.ex:235
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:45
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:50
@ -616,8 +616,8 @@ msgstr ""
msgid "Rounds:" msgid "Rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:170 #: lib/cannery_web/components/ammo_group_table_component.ex:177
#: lib/cannery_web/components/ammo_group_table_component.ex:247 #: lib/cannery_web/components/ammo_group_table_component.ex:259
#: lib/cannery_web/components/ammo_type_table_component.ex:234 #: lib/cannery_web/components/ammo_type_table_component.ex:234
#: lib/cannery_web/live/ammo_type_live/show.html.heex:139 #: lib/cannery_web/live/ammo_type_live/show.html.heex:139
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -792,7 +792,7 @@ msgstr ""
msgid "Leave \"Uses left\" blank to make invite unlimited" msgid "Leave \"Uses left\" blank to make invite unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:57 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container:" msgid "Container:"
msgstr "" msgstr ""
@ -805,7 +805,7 @@ msgstr ""
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:207 #: lib/cannery_web/components/ammo_group_table_component.ex:218
#: lib/cannery_web/live/ammo_group_live/show.html.heex:19 #: lib/cannery_web/live/ammo_group_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
@ -992,7 +992,7 @@ msgstr ""
msgid "Edit %{ammo_type_name}" msgid "Edit %{ammo_type_name}"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:255 #: lib/cannery_web/components/ammo_group_table_component.ex:267
#: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17 #: lib/cannery_web/components/core_components/ammo_group_card.html.heex:17
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
@ -1038,7 +1038,7 @@ msgstr ""
msgid "Last used on:" msgid "Last used on:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:191 #: lib/cannery_web/components/ammo_group_table_component.ex:198
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Never used" msgid "Never used"
msgstr "" msgstr ""

View File

@ -24,7 +24,7 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:201 #: lib/cannery/containers.ex:220
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "Caithfidh an coimeádán a bheidh follamh roimh scriosadh" msgstr "Caithfidh an coimeádán a bheidh follamh roimh scriosadh"
@ -170,7 +170,7 @@ msgstr ""
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "" msgstr ""
#: lib/cannery/ammo.ex:1016 #: lib/cannery/ammo.ex:1043
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "" msgstr ""

View File

@ -45,7 +45,7 @@ defmodule Cannery.AmmoTest do
assert Ammo.list_ammo_types(current_user) == [ammo_type] assert Ammo.list_ammo_types(current_user) == [ammo_type]
end end
test "list_ammo_types/1 returns relevant ammo_types for a user", test "list_ammo_types/2 returns relevant ammo_types for a user",
%{current_user: current_user} do %{current_user: current_user} do
ammo_type_a = ammo_type_a =
%{"name" => "bullets", "desc" => "has some pews in it", "grains" => 5} %{"name" => "bullets", "desc" => "has some pews in it", "grains" => 5}
@ -89,12 +89,12 @@ defmodule Cannery.AmmoTest do
assert Ammo.list_ammo_types("tracer", current_user) == [ammo_type_c] assert Ammo.list_ammo_types("tracer", current_user) == [ammo_type_c]
end end
test "get_ammo_type!/1 returns the ammo_type with given id", test "get_ammo_type!/2 returns the ammo_type with given id",
%{ammo_type: ammo_type, current_user: current_user} do %{ammo_type: ammo_type, current_user: current_user} do
assert Ammo.get_ammo_type!(ammo_type.id, current_user) == ammo_type assert Ammo.get_ammo_type!(ammo_type.id, current_user) == ammo_type
end end
test "create_ammo_type/1 with valid data creates a ammo_type", test "create_ammo_type/2 with valid data creates a ammo_type",
%{current_user: current_user} do %{current_user: current_user} do
assert {:ok, %AmmoType{} = ammo_type} = Ammo.create_ammo_type(@valid_attrs, current_user) assert {:ok, %AmmoType{} = ammo_type} = Ammo.create_ammo_type(@valid_attrs, current_user)
assert ammo_type.bullet_type == "some bullet_type" assert ammo_type.bullet_type == "some bullet_type"
@ -105,12 +105,12 @@ defmodule Cannery.AmmoTest do
assert ammo_type.grains == 120 assert ammo_type.grains == 120
end end
test "create_ammo_type/1 with invalid data returns error changeset", test "create_ammo_type/2 with invalid data returns error changeset",
%{current_user: current_user} do %{current_user: current_user} do
assert {:error, %Changeset{}} = Ammo.create_ammo_type(@invalid_attrs, current_user) assert {:error, %Changeset{}} = Ammo.create_ammo_type(@invalid_attrs, current_user)
end end
test "update_ammo_type/2 with valid data updates the ammo_type", test "update_ammo_type/3 with valid data updates the ammo_type",
%{ammo_type: ammo_type, current_user: current_user} do %{ammo_type: ammo_type, current_user: current_user} do
assert {:ok, %AmmoType{} = ammo_type} = assert {:ok, %AmmoType{} = ammo_type} =
Ammo.update_ammo_type(ammo_type, @update_attrs, current_user) Ammo.update_ammo_type(ammo_type, @update_attrs, current_user)
@ -123,7 +123,7 @@ defmodule Cannery.AmmoTest do
assert ammo_type.grains == 456 assert ammo_type.grains == 456
end end
test "update_ammo_type/2 with invalid data returns error changeset", test "update_ammo_type/3 with invalid data returns error changeset",
%{ammo_type: ammo_type, current_user: current_user} do %{ammo_type: ammo_type, current_user: current_user} do
assert {:error, %Changeset{}} = assert {:error, %Changeset{}} =
Ammo.update_ammo_type(ammo_type, @invalid_attrs, current_user) Ammo.update_ammo_type(ammo_type, @invalid_attrs, current_user)
@ -131,7 +131,7 @@ defmodule Cannery.AmmoTest do
assert ammo_type == Ammo.get_ammo_type!(ammo_type.id, current_user) assert ammo_type == Ammo.get_ammo_type!(ammo_type.id, current_user)
end end
test "delete_ammo_type/1 deletes the ammo_type", test "delete_ammo_type/2 deletes the ammo_type",
%{ammo_type: ammo_type, current_user: current_user} do %{ammo_type: ammo_type, current_user: current_user} do
assert {:ok, %AmmoType{}} = Ammo.delete_ammo_type(ammo_type, current_user) assert {:ok, %AmmoType{}} = Ammo.delete_ammo_type(ammo_type, current_user)
assert_raise Ecto.NoResultsError, fn -> Ammo.get_ammo_type!(ammo_type.id, current_user) end assert_raise Ecto.NoResultsError, fn -> Ammo.get_ammo_type!(ammo_type.id, current_user) end
@ -785,7 +785,7 @@ defmodule Cannery.AmmoTest do
assert %{^another_ammo_type_id => 1} = ammo_groups_count assert %{^another_ammo_type_id => 1} = ammo_groups_count
end end
test "list_staged_ammo_groups/2 returns all ammo_groups that are staged", test "list_staged_ammo_groups/1 returns all ammo_groups that are staged",
%{ %{
ammo_type: ammo_type, ammo_type: ammo_type,
container: container, container: container,
@ -797,7 +797,7 @@ defmodule Cannery.AmmoTest do
assert Ammo.list_staged_ammo_groups(current_user) == [another_ammo_group] assert Ammo.list_staged_ammo_groups(current_user) == [another_ammo_group]
end end
test "get_ammo_group!/1 returns the ammo_group with given id", test "get_ammo_group!/2 returns the ammo_group with given id",
%{ammo_group: %{id: ammo_group_id} = ammo_group, current_user: current_user} do %{ammo_group: %{id: ammo_group_id} = ammo_group, current_user: current_user} do
assert Ammo.get_ammo_group!(ammo_group_id, current_user) == ammo_group assert Ammo.get_ammo_group!(ammo_group_id, current_user) == ammo_group
end end
@ -861,7 +861,7 @@ defmodule Cannery.AmmoTest do
|> Ammo.create_ammo_groups(1, current_user) |> Ammo.create_ammo_groups(1, current_user)
end end
test "update_ammo_group/2 with valid data updates the ammo_group", test "update_ammo_group/3 with valid data updates the ammo_group",
%{ammo_group: ammo_group, current_user: current_user} do %{ammo_group: ammo_group, current_user: current_user} do
assert {:ok, %AmmoGroup{} = ammo_group} = assert {:ok, %AmmoGroup{} = ammo_group} =
Ammo.update_ammo_group(ammo_group, @update_attrs, current_user) Ammo.update_ammo_group(ammo_group, @update_attrs, current_user)
@ -871,7 +871,7 @@ defmodule Cannery.AmmoTest do
assert ammo_group.price_paid == 456.7 assert ammo_group.price_paid == 456.7
end end
test "update_ammo_group/2 with invalid data returns error changeset", test "update_ammo_group/3 with invalid data returns error changeset",
%{ammo_group: ammo_group, current_user: current_user} do %{ammo_group: ammo_group, current_user: current_user} do
assert {:error, %Changeset{}} = assert {:error, %Changeset{}} =
Ammo.update_ammo_group(ammo_group, @invalid_attrs, current_user) Ammo.update_ammo_group(ammo_group, @invalid_attrs, current_user)
@ -879,13 +879,13 @@ defmodule Cannery.AmmoTest do
assert ammo_group == Ammo.get_ammo_group!(ammo_group.id, current_user) assert ammo_group == Ammo.get_ammo_group!(ammo_group.id, current_user)
end end
test "delete_ammo_group/1 deletes the ammo_group", test "delete_ammo_group/2 deletes the ammo_group",
%{ammo_group: ammo_group, current_user: current_user} do %{ammo_group: ammo_group, current_user: current_user} do
assert {:ok, %AmmoGroup{}} = Ammo.delete_ammo_group(ammo_group, current_user) assert {:ok, %AmmoGroup{}} = Ammo.delete_ammo_group(ammo_group, current_user)
assert_raise KeyError, fn -> Ammo.get_ammo_group!(ammo_group.id, current_user) end assert_raise KeyError, fn -> Ammo.get_ammo_group!(ammo_group.id, current_user) end
end end
test "get_percentage_remaining/1 gets accurate total round count", test "get_percentage_remaining/2 gets accurate total round count",
%{ammo_group: %{id: ammo_group_id} = ammo_group, current_user: current_user} do %{ammo_group: %{id: ammo_group_id} = ammo_group, current_user: current_user} do
assert 100 = ammo_group |> Ammo.get_percentage_remaining(current_user) assert 100 = ammo_group |> Ammo.get_percentage_remaining(current_user)
@ -902,6 +902,53 @@ defmodule Cannery.AmmoTest do
assert 0 = ammo_group |> Ammo.get_percentage_remaining(current_user) assert 0 = ammo_group |> Ammo.get_percentage_remaining(current_user)
end end
test "get_percentages_remaining/2 gets accurate total round count", %{
ammo_group: %{id: ammo_group_id} = ammo_group,
ammo_type: ammo_type,
container: container,
current_user: current_user
} do
assert %{ammo_group_id => 100} ==
[ammo_group] |> Ammo.get_percentages_remaining(current_user)
{1, [%{id: another_ammo_group_id} = another_ammo_group]} =
%{"count" => 50, "price_paid" => 36.1}
|> ammo_group_fixture(ammo_type, container, current_user)
percentages =
[ammo_group, another_ammo_group] |> Ammo.get_percentages_remaining(current_user)
assert %{^ammo_group_id => 100} = percentages
assert %{^another_ammo_group_id => 100} = percentages
shot_group_fixture(%{"count" => 14}, current_user, ammo_group)
ammo_group = Ammo.get_ammo_group!(ammo_group_id, current_user)
percentages =
[ammo_group, another_ammo_group] |> Ammo.get_percentages_remaining(current_user)
assert %{^ammo_group_id => 72} = percentages
assert %{^another_ammo_group_id => 100} = percentages
shot_group_fixture(%{"count" => 11}, current_user, ammo_group)
ammo_group = Ammo.get_ammo_group!(ammo_group_id, current_user)
percentages =
[ammo_group, another_ammo_group] |> Ammo.get_percentages_remaining(current_user)
assert %{^ammo_group_id => 50} = percentages
assert %{^another_ammo_group_id => 100} = percentages
shot_group_fixture(%{"count" => 25}, current_user, ammo_group)
ammo_group = Ammo.get_ammo_group!(ammo_group_id, current_user)
percentages =
[ammo_group, another_ammo_group] |> Ammo.get_percentages_remaining(current_user)
assert %{^ammo_group_id => 0} = percentages
assert %{^another_ammo_group_id => 100} = percentages
end
test "get_cpr/2 gets accurate cpr", test "get_cpr/2 gets accurate cpr",
%{ammo_type: ammo_type, container: container, current_user: current_user} do %{ammo_type: ammo_type, container: container, current_user: current_user} do
{1, [ammo_group]} = ammo_group_fixture(%{"count" => 1}, ammo_type, container, current_user) {1, [ammo_group]} = ammo_group_fixture(%{"count" => 1}, ammo_type, container, current_user)

View File

@ -90,12 +90,24 @@ defmodule Cannery.ContainersTest do
assert Containers.list_containers("asajslkdflskdf", current_user) == [] assert Containers.list_containers("asajslkdflskdf", current_user) == []
end end
test "get_container!/1 returns the container with given id", test "get_container!/2 returns the container with given id",
%{current_user: current_user, container: container} do %{current_user: current_user, container: container} do
assert Containers.get_container!(container.id, current_user) == container assert Containers.get_container!(container.id, current_user) == container
assert_raise KeyError, fn -> Containers.get_container!(current_user.id, current_user) end
end end
test "create_container/1 with valid data creates a container", %{current_user: current_user} do test "get_containers/2 returns the container with given id",
%{current_user: current_user, container: %{id: container_id} = container} do
assert %{container_id => container} ==
Containers.get_containers([container_id], current_user)
%{id: another_container_id} = another_container = container_fixture(current_user)
containers = [container_id, another_container_id] |> Containers.get_containers(current_user)
assert %{^container_id => ^container} = containers
assert %{^another_container_id => ^another_container} = containers
end
test "create_container/2 with valid data creates a container", %{current_user: current_user} do
assert {:ok, %Container{} = container} = assert {:ok, %Container{} = container} =
@valid_attrs |> Containers.create_container(current_user) @valid_attrs |> Containers.create_container(current_user)
@ -106,12 +118,12 @@ defmodule Cannery.ContainersTest do
assert container.user_id == current_user.id assert container.user_id == current_user.id
end end
test "create_container/1 with invalid data returns error changeset", test "create_container/2 with invalid data returns error changeset",
%{current_user: current_user} do %{current_user: current_user} do
assert {:error, %Changeset{}} = @invalid_attrs |> Containers.create_container(current_user) assert {:error, %Changeset{}} = @invalid_attrs |> Containers.create_container(current_user)
end end
test "update_container/2 with valid data updates the container", test "update_container/3 with valid data updates the container",
%{current_user: current_user, container: container} do %{current_user: current_user, container: container} do
assert {:ok, %Container{} = container} = assert {:ok, %Container{} = container} =
Containers.update_container(container, current_user, @update_attrs) Containers.update_container(container, current_user, @update_attrs)
@ -122,7 +134,7 @@ defmodule Cannery.ContainersTest do
assert container.type == "some updated type" assert container.type == "some updated type"
end end
test "update_container/2 with invalid data returns error changeset", test "update_container/3 with invalid data returns error changeset",
%{current_user: current_user, container: container} do %{current_user: current_user, container: container} do
assert {:error, %Changeset{}} = assert {:error, %Changeset{}} =
Containers.update_container(container, current_user, @invalid_attrs) Containers.update_container(container, current_user, @invalid_attrs)
@ -130,11 +142,11 @@ defmodule Cannery.ContainersTest do
assert container == Containers.get_container!(container.id, current_user) assert container == Containers.get_container!(container.id, current_user)
end end
test "delete_container/1 deletes the container", test "delete_container/2 deletes the container",
%{current_user: current_user, container: container} do %{current_user: current_user, container: container} do
assert {:ok, %Container{}} = Containers.delete_container(container, current_user) assert {:ok, %Container{}} = Containers.delete_container(container, current_user)
assert_raise Ecto.NoResultsError, fn -> assert_raise KeyError, fn ->
Containers.get_container!(container.id, current_user) Containers.get_container!(container.id, current_user)
end end
end end
@ -168,36 +180,36 @@ defmodule Cannery.ContainersTest do
assert Containers.list_tags("hollows", current_user) == [tag_b] assert Containers.list_tags("hollows", current_user) == [tag_b]
end end
test "get_tag!/1 returns the tag with given id", %{tag: tag, current_user: current_user} do test "get_tag!/2 returns the tag with given id", %{tag: tag, current_user: current_user} do
assert Containers.get_tag!(tag.id, current_user) == tag assert Containers.get_tag!(tag.id, current_user) == tag
end end
test "create_tag/1 with valid data creates a tag", %{current_user: current_user} do test "create_tag/2 with valid data creates a tag", %{current_user: current_user} do
assert {:ok, %Tag{} = tag} = Containers.create_tag(@valid_tag_attrs, current_user) assert {:ok, %Tag{} = tag} = Containers.create_tag(@valid_tag_attrs, current_user)
assert tag.bg_color == "some bg-color" assert tag.bg_color == "some bg-color"
assert tag.name == "some name" assert tag.name == "some name"
assert tag.text_color == "some text-color" assert tag.text_color == "some text-color"
end end
test "create_tag/1 with invalid data returns error changeset", test "create_tag/2 with invalid data returns error changeset",
%{current_user: current_user} do %{current_user: current_user} do
assert {:error, %Changeset{}} = Containers.create_tag(@invalid_tag_attrs, current_user) assert {:error, %Changeset{}} = Containers.create_tag(@invalid_tag_attrs, current_user)
end end
test "update_tag/2 with valid data updates the tag", %{tag: tag, current_user: current_user} do test "update_tag/3 with valid data updates the tag", %{tag: tag, current_user: current_user} do
assert {:ok, %Tag{} = tag} = Containers.update_tag(tag, @update_tag_attrs, current_user) assert {:ok, %Tag{} = tag} = Containers.update_tag(tag, @update_tag_attrs, current_user)
assert tag.bg_color == "some updated bg-color" assert tag.bg_color == "some updated bg-color"
assert tag.name == "some updated name" assert tag.name == "some updated name"
assert tag.text_color == "some updated text-color" assert tag.text_color == "some updated text-color"
end end
test "update_tag/2 with invalid data returns error changeset", test "update_tag/3 with invalid data returns error changeset",
%{tag: tag, current_user: current_user} do %{tag: tag, current_user: current_user} do
assert {:error, %Changeset{}} = Containers.update_tag(tag, @invalid_tag_attrs, current_user) assert {:error, %Changeset{}} = Containers.update_tag(tag, @invalid_tag_attrs, current_user)
assert tag == Containers.get_tag!(tag.id, current_user) assert tag == Containers.get_tag!(tag.id, current_user)
end end
test "delete_tag/1 deletes the tag", %{tag: tag, current_user: current_user} do test "delete_tag/2 deletes the tag", %{tag: tag, current_user: current_user} do
assert {:ok, %Tag{}} = Containers.delete_tag(tag, current_user) assert {:ok, %Tag{}} = Containers.delete_tag(tag, current_user)
assert_raise Ecto.NoResultsError, fn -> Containers.get_tag!(tag.id, current_user) end assert_raise Ecto.NoResultsError, fn -> Containers.get_tag!(tag.id, current_user) end
end end

View File

@ -309,12 +309,8 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
assert html =~ dgettext("actions", "Show used") assert html =~ dgettext("actions", "Show used")
refute html =~ gettext("$%{amount}", amount: display_currency(50.00)) refute html =~ gettext("$%{amount}", amount: display_currency(50.00))
refute html =~ percentage = ammo_group |> Ammo.get_percentage_remaining(current_user)
"\n" <> refute html =~ "\n#{gettext("%{percentage}%", percentage: percentage)}\n"
gettext("%{percentage}%",
percentage: ammo_group |> Ammo.get_percentage_remaining(current_user)
) <>
"\n"
html = html =
show_live show_live
@ -323,12 +319,8 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
assert html =~ gettext("$%{amount}", amount: display_currency(50.00)) assert html =~ gettext("$%{amount}", amount: display_currency(50.00))
assert html =~ percentage = ammo_group |> Ammo.get_percentage_remaining(current_user)
"\n" <> assert html =~ "\n#{gettext("%{percentage}%", percentage: percentage)}\n"
gettext("%{percentage}%",
percentage: ammo_group |> Ammo.get_percentage_remaining(current_user)
) <>
"\n"
end end
end end