diff --git a/priv/repo/migrations/20260312135336_seed_retailers_and_calibers.exs b/priv/repo/migrations/20260312135336_seed_retailers_and_calibers.exs new file mode 100644 index 0000000..29cd4b3 --- /dev/null +++ b/priv/repo/migrations/20260312135336_seed_retailers_and_calibers.exs @@ -0,0 +1,63 @@ +defmodule Ammoprices.Repo.Migrations.SeedRetailersAndCalibers do + use Ecto.Migration + + def up do + now = DateTime.utc_now() |> DateTime.truncate(:second) |> DateTime.to_naive() + + retailers = [ + %{name: "Lucky Gunner", slug: "lucky-gunner", base_url: "https://www.luckygunner.com"}, + %{name: "SGAmmo", slug: "sgammo", base_url: "https://www.sgammo.com"}, + %{ + name: "Target Sports USA", + slug: "target-sports-usa", + base_url: "https://www.targetsportsusa.com" + } + ] + + for r <- retailers do + execute(""" + INSERT INTO retailers (id, name, slug, base_url, inserted_at, updated_at) + VALUES (gen_random_uuid(), '#{r.name}', '#{r.slug}', '#{r.base_url}', '#{now}', '#{now}') + ON CONFLICT (slug) DO NOTHING + """) + end + + calibers = [ + {"9mm Luger", "9mm-luger", "handgun", ~s({"9mm","9x19","9mm parabellum","9mm nato"})}, + {".45 ACP", "45-acp", "handgun", ~s({".45 acp","45 acp",".45 auto","45 auto"})}, + {".380 ACP", "380-acp", "handgun", ~s({".380","380 acp",".380 auto","380 auto"})}, + {".40 S&W", "40-sw", "handgun", ~s({".40 s&w","40 s&w",".40 cal","40 cal"})}, + {".38 Special", "38-special", "handgun", ~s({".38 spl","38 special",".38 spc","38 spl"})}, + {".357 Magnum", "357-magnum", "handgun", ~s({".357 mag","357 mag","357 magnum"})}, + {"10mm Auto", "10mm-auto", "handgun", ~s({"10mm","10mm auto"})}, + {"5.56x45 / .223 Rem", "556-223", "rifle", + ~s({"5.56","5.56x45",".223",".223 rem","223 remington","5.56 nato"})}, + {".308 Win / 7.62x51", "308-win", "rifle", + ~s({".308",".308 win","308 winchester","7.62x51","7.62 nato"})}, + {"7.62x39", "762x39", "rifle", ~s({"7.62x39","7.62x39mm"})}, + {".30-06 Springfield", "30-06", "rifle", + ~s({".30-06","30-06","30-06 springfield",".30-06 sprg"})}, + {".300 Blackout", "300-blackout", "rifle", + ~s({".300 blk","300 blackout",".300 aac blackout","300 blk"})}, + {"6.5 Creedmoor", "65-creedmoor", "rifle", ~s({"6.5 creedmoor","6.5cm","6.5 cm"})}, + {".22 LR", "22-lr", "rimfire", ~s({".22 lr","22 lr",".22 long rifle","22 long rifle"})}, + {".22 WMR", "22-wmr", "rimfire", ~s({".22 wmr","22 wmr",".22 magnum","22 mag"})}, + {".17 HMR", "17-hmr", "rimfire", ~s({".17 hmr","17 hmr",".17 hornady magnum"})}, + {"12 Gauge", "12-gauge", "shotgun", ~s({"12 gauge","12 ga","12ga"})}, + {"20 Gauge", "20-gauge", "shotgun", ~s({"20 gauge","20 ga","20ga"})} + ] + + for {name, slug, category, aliases} <- calibers do + execute(""" + INSERT INTO calibers (id, name, slug, category, aliases, inserted_at, updated_at) + VALUES (gen_random_uuid(), '#{name}', '#{slug}', '#{category}', '#{aliases}', '#{now}', '#{now}') + ON CONFLICT (slug) DO NOTHING + """) + end + end + + def down do + execute("DELETE FROM calibers") + execute("DELETE FROM retailers") + end +end diff --git a/test/ammoprices/catalog_test.exs b/test/ammoprices/catalog_test.exs index da65a70..226c5ae 100644 --- a/test/ammoprices/catalog_test.exs +++ b/test/ammoprices/catalog_test.exs @@ -8,7 +8,7 @@ defmodule Ammoprices.CatalogTest do describe "retailers" do test "list_retailers/0 returns all retailers" do retailer = retailer_fixture() - assert Catalog.list_retailers() == [retailer] + assert retailer in Catalog.list_retailers() end test "get_retailer!/1 returns the retailer with given id" do @@ -22,11 +22,11 @@ defmodule Ammoprices.CatalogTest do end test "create_retailer/1 with valid data creates a retailer" do - attrs = %{name: "Lucky Gunner", slug: "lucky-gunner", base_url: "https://luckygunner.com"} + attrs = %{name: "New Retailer", slug: "new-retailer", base_url: "https://newretailer.com"} assert {:ok, retailer} = Catalog.create_retailer(attrs) - assert retailer.name == "Lucky Gunner" - assert retailer.slug == "lucky-gunner" - assert retailer.base_url == "https://luckygunner.com" + assert retailer.name == "New Retailer" + assert retailer.slug == "new-retailer" + assert retailer.base_url == "https://newretailer.com" assert retailer.enabled == true end @@ -52,7 +52,7 @@ defmodule Ammoprices.CatalogTest do describe "calibers" do test "list_calibers/0 returns all calibers" do caliber = caliber_fixture() - assert Catalog.list_calibers() == [caliber] + assert caliber in Catalog.list_calibers() end test "list_calibers_by_category/1 filters by category" do @@ -60,7 +60,8 @@ defmodule Ammoprices.CatalogTest do _rifle = caliber_fixture(%{name: "5.56", slug: "556", category: "rifle"}) result = Catalog.list_calibers_by_category("handgun") - assert result == [handgun] + assert handgun in result + refute Enum.any?(result, &(&1.category != "handgun")) end test "get_caliber!/1 returns the caliber with given id" do @@ -75,15 +76,15 @@ defmodule Ammoprices.CatalogTest do test "create_caliber/1 with valid data creates a caliber" do attrs = %{ - name: ".45 ACP", - slug: "45-acp", + name: ".50 AE", + slug: "50-ae", category: "handgun", - aliases: [".45", "45 auto"] + aliases: [".50 ae", "50 action express"] } assert {:ok, caliber} = Catalog.create_caliber(attrs) - assert caliber.name == ".45 ACP" - assert caliber.aliases == [".45", "45 auto"] + assert caliber.name == ".50 AE" + assert caliber.aliases == [".50 ae", "50 action express"] end test "create_caliber/1 with invalid category returns error" do diff --git a/test/support/fixtures.ex b/test/support/fixtures.ex index c13f5fd..2a0e617 100644 --- a/test/support/fixtures.ex +++ b/test/support/fixtures.ex @@ -10,40 +10,44 @@ defmodule Ammoprices.Fixtures do alias Ammoprices.Repo def retailer_fixture(attrs \\ %{}) do - {:ok, retailer} = - %Retailer{} - |> Retailer.changeset( - Map.merge( - %{ - name: "Test Retailer", - slug: "test-retailer-#{System.unique_integer([:positive])}", - base_url: "https://example.com" - }, - attrs - ) + merged = + Map.merge( + %{ + name: "Test Retailer", + slug: "test-retailer-#{System.unique_integer([:positive])}", + base_url: "https://example.com" + }, + attrs ) - |> Repo.insert() - retailer + %Retailer{} + |> Retailer.changeset(merged) + |> Repo.insert!( + on_conflict: {:replace, [:name, :base_url, :updated_at]}, + conflict_target: :slug, + returning: true + ) end def caliber_fixture(attrs \\ %{}) do - {:ok, caliber} = - %Caliber{} - |> Caliber.changeset( - Map.merge( - %{ - name: "9mm Luger", - slug: "9mm-luger-#{System.unique_integer([:positive])}", - category: "handgun", - aliases: ["9mm", "9x19"] - }, - attrs - ) + merged = + Map.merge( + %{ + name: "9mm Luger", + slug: "9mm-luger-#{System.unique_integer([:positive])}", + category: "handgun", + aliases: ["9mm", "9x19"] + }, + attrs ) - |> Repo.insert() - caliber + %Caliber{} + |> Caliber.changeset(merged) + |> Repo.insert!( + on_conflict: {:replace, [:name, :category, :aliases, :updated_at]}, + conflict_target: :slug, + returning: true + ) end def product_fixture(attrs \\ %{}) do