Seed retailers and calibers via database migration

This commit is contained in:
Graham McIntire 2026-03-12 08:55:12 -05:00
parent 56d02cf8cb
commit cd8c080846
No known key found for this signature in database
3 changed files with 107 additions and 39 deletions

View file

@ -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

View file

@ -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

View file

@ -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