diff --git a/example/database-app/databases/seeds/category_seeder.py b/example/database-app/databases/seeders/category_seeder.py similarity index 86% rename from example/database-app/databases/seeds/category_seeder.py rename to example/database-app/databases/seeders/category_seeder.py index 475f58aa..5f8b047a 100644 --- a/example/database-app/databases/seeds/category_seeder.py +++ b/example/database-app/databases/seeders/category_seeder.py @@ -1,4 +1,4 @@ -from fastapi_startkit.masoniteorm.seeds import Seeder +from fastapi_startkit.masoniteorm.seeders import Seeder from app.models.category import Category diff --git a/example/database-app/databases/seeds/course_seeder.py b/example/database-app/databases/seeders/course_seeder.py similarity index 97% rename from example/database-app/databases/seeds/course_seeder.py rename to example/database-app/databases/seeders/course_seeder.py index 440c5cd5..d8accf35 100644 --- a/example/database-app/databases/seeds/course_seeder.py +++ b/example/database-app/databases/seeders/course_seeder.py @@ -1,4 +1,4 @@ -from fastapi_startkit.masoniteorm.seeds import Seeder +from fastapi_startkit.masoniteorm.seeders import Seeder from app.models.category import Category from app.models.course import Course from app.models.user import User diff --git a/example/database-app/databases/seeds/database_seeder.py b/example/database-app/databases/seeders/database_seeder.py similarity index 86% rename from example/database-app/databases/seeds/database_seeder.py rename to example/database-app/databases/seeders/database_seeder.py index 15e4c682..b458e252 100644 --- a/example/database-app/databases/seeds/database_seeder.py +++ b/example/database-app/databases/seeders/database_seeder.py @@ -1,4 +1,4 @@ -from fastapi_startkit.masoniteorm.seeds import Seeder +from fastapi_startkit.masoniteorm.seeders import Seeder from .category_seeder import CategorySeeder from .user_seeder import UserSeeder from .course_seeder import CourseSeeder diff --git a/example/database-app/databases/seeds/post_seeder.py b/example/database-app/databases/seeders/post_seeder.py similarity index 95% rename from example/database-app/databases/seeds/post_seeder.py rename to example/database-app/databases/seeders/post_seeder.py index 890fd7c6..bb6f5d92 100644 --- a/example/database-app/databases/seeds/post_seeder.py +++ b/example/database-app/databases/seeders/post_seeder.py @@ -1,4 +1,4 @@ -from fastapi_startkit.masoniteorm.seeds import Seeder +from fastapi_startkit.masoniteorm.seeders import Seeder from app.models import Post, User, Tag, PostTag diff --git a/example/database-app/databases/seeds/review_seeder.py b/example/database-app/databases/seeders/review_seeder.py similarity index 95% rename from example/database-app/databases/seeds/review_seeder.py rename to example/database-app/databases/seeders/review_seeder.py index 29dd3f22..44169d9a 100644 --- a/example/database-app/databases/seeds/review_seeder.py +++ b/example/database-app/databases/seeders/review_seeder.py @@ -1,4 +1,4 @@ -from fastapi_startkit.masoniteorm.seeds import Seeder +from fastapi_startkit.masoniteorm.seeders import Seeder from app.models.course import Course from app.models.review import Review diff --git a/example/database-app/databases/seeds/user_seeder.py b/example/database-app/databases/seeders/user_seeder.py similarity index 96% rename from example/database-app/databases/seeds/user_seeder.py rename to example/database-app/databases/seeders/user_seeder.py index 737612cc..948f4cd3 100644 --- a/example/database-app/databases/seeds/user_seeder.py +++ b/example/database-app/databases/seeders/user_seeder.py @@ -1,4 +1,4 @@ -from fastapi_startkit.masoniteorm.seeds import Seeder +from fastapi_startkit.masoniteorm.seeders import Seeder from app.models.user import User from app.models.profile import Profile diff --git a/example/inertia-pingcrm-app/databases/seeds/database_seeder.py b/example/inertia-pingcrm-app/databases/seeders/database_seeder.py similarity index 95% rename from example/inertia-pingcrm-app/databases/seeds/database_seeder.py rename to example/inertia-pingcrm-app/databases/seeders/database_seeder.py index 9487b08b..65d337c7 100644 --- a/example/inertia-pingcrm-app/databases/seeds/database_seeder.py +++ b/example/inertia-pingcrm-app/databases/seeders/database_seeder.py @@ -1,4 +1,4 @@ -from fastapi_startkit.masoniteorm.seeds import Seeder +from fastapi_startkit.masoniteorm.seeders import Seeder from app.models.Account import Account from app.models.User import User from app.models.Organization import Organization diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py index 92c39155..9c616dbb 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py @@ -29,7 +29,7 @@ class DBSeedCommand(Command): "directory", "d", flag=False, - default="databases/seeds", + default="databases/seeders", description="The location of the seed directory", ), option( @@ -46,7 +46,7 @@ def handle(self): return asyncio.run(self.handle_async()) async def handle_async(self): - from ..seeds import Seeder + from ..seeders import Seeder seeder = Seeder( seed_path=self.option("directory"), diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py index a0662274..39c66c5f 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py @@ -50,7 +50,7 @@ class MakeModelCommand(Command): "seeders-directory", "S", flag=False, - default="databases/seeds", + default="databases/seeders", description="The location of the seeders directory", ), ] diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py index 3033ec03..badf3b8d 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py @@ -16,7 +16,7 @@ class MakeSeedCommand(Command): "directory", "d", flag=False, - default="databases/seeds", + default="databases/seeders", description="The location of the seed directory", ), ] diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py index c0d0040f..8c5e3cb9 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py @@ -39,7 +39,7 @@ class MigrateFreshCommand(Command): "seed-directory", None, flag=False, - default="databases/seeds", + default="databases/seeders", description="The location of the seed directory", ), ] diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py index 6be6bc41..22e5d94d 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py @@ -40,7 +40,7 @@ class MigrateRefreshCommand(Command): "seed-directory", None, flag=False, - default="databases/seeds", + default="databases/seeders", description="The location of the seed directory", ), ] diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub index bd879360..9ce9b583 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub @@ -1,6 +1,6 @@ """__SEEDER_NAME__ Seeder.""" -from masoniteorm.seeds import Seeder +from fastapi_startkit.masoniteorm.seeders import Seeder class __SEEDER_NAME__(Seeder): diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/seeds/Seeder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/seeders/Seeder.py similarity index 94% rename from fastapi_startkit/src/fastapi_startkit/masoniteorm/seeds/Seeder.py rename to fastapi_startkit/src/fastapi_startkit/masoniteorm/seeders/Seeder.py index a555850c..b4c0d5f6 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/seeds/Seeder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/seeders/Seeder.py @@ -2,7 +2,7 @@ class Seeder: - def __init__(self, seed_path="databases/seeds", connection=None): + def __init__(self, seed_path="databases/seeders", connection=None): self.ran_seeds = [] self.seed_path = seed_path self.connection = connection diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/seeds/__init__.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/seeders/__init__.py similarity index 100% rename from fastapi_startkit/src/fastapi_startkit/masoniteorm/seeds/__init__.py rename to fastapi_startkit/src/fastapi_startkit/masoniteorm/seeders/__init__.py diff --git a/fastapi_startkit/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md b/fastapi_startkit/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md index da7503f5..abd2854f 100644 --- a/fastapi_startkit/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +++ b/fastapi_startkit/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md @@ -85,7 +85,7 @@ class CreateLessonsTable(Migration): ```python # databases/seeders/course_seeder.py -from fastapi_startkit.masoniteorm.seeds import Seeder +from fastapi_startkit.masoniteorm.seeders import Seeder from app.models.course import Course diff --git a/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/__init__.py b/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/database_seeder.py b/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/database_seeder.py new file mode 100644 index 00000000..6460ecd7 --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/database_seeder.py @@ -0,0 +1,8 @@ +from fastapi_startkit.masoniteorm.seeders import Seeder + +from .recorder import CALLS + + +class DatabaseSeeder(Seeder): + async def run(self): + CALLS.append(("database", self.connection)) diff --git a/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/recorder.py b/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/recorder.py new file mode 100644 index 00000000..0d32f16f --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/recorder.py @@ -0,0 +1,3 @@ +"""Shared call recorder used by the fixture seeder classes below.""" + +CALLS = [] diff --git a/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/sample_seeder.py b/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/sample_seeder.py new file mode 100644 index 00000000..aa19a2b1 --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/sample_seeder.py @@ -0,0 +1,8 @@ +from fastapi_startkit.masoniteorm.seeders import Seeder + +from .recorder import CALLS + + +class SampleSeeder(Seeder): + async def run(self): + CALLS.append(("sample", self.connection)) diff --git a/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/special_seeder.py b/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/special_seeder.py new file mode 100644 index 00000000..d51a277d --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/special_seeder.py @@ -0,0 +1,8 @@ +from fastapi_startkit.masoniteorm.seeders import Seeder + +from .recorder import CALLS + + +class SpecialSeeder(Seeder): + async def run(self): + CALLS.append(("special", self.connection)) diff --git a/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/user_table_seeder.py b/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/user_table_seeder.py new file mode 100644 index 00000000..250278f6 --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/commands/fixtures/databases/seeders/user_table_seeder.py @@ -0,0 +1,8 @@ +from fastapi_startkit.masoniteorm.seeders import Seeder + +from .recorder import CALLS + + +class UserTableSeeder(Seeder): + async def run(self): + CALLS.append(("user_table", self.connection)) diff --git a/fastapi_startkit/tests/masoniteorm/commands/test_seed_commands.py b/fastapi_startkit/tests/masoniteorm/commands/test_seed_commands.py new file mode 100644 index 00000000..c1559d3b --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/commands/test_seed_commands.py @@ -0,0 +1,87 @@ +import unittest + +from cleo.testers.command_tester import CommandTester + +from fastapi_startkit.masoniteorm.commands.DBSeedCommand import DBSeedCommand + +from .fixtures.databases.seeders.recorder import CALLS + +FIXTURE_SEED_PATH = "tests.masoniteorm.commands.fixtures.databases.seeders" + + +class TestDBSeedCommand(unittest.TestCase): + def setUp(self): + CALLS.clear() + + def tearDown(self): + CALLS.clear() + + def _make_tester(self): + command = DBSeedCommand() + return CommandTester(command) + + def test_runs_database_seeder_by_default(self): + tester = self._make_tester() + tester.execute(f"--directory {FIXTURE_SEED_PATH} --connection sqlite") + + output = tester.io.fetch_output() + self.assertIn("Database Seeder seeded!", output) + self.assertEqual(CALLS, [("database", "sqlite")]) + + def test_runs_seeder_for_table_argument(self): + tester = self._make_tester() + tester.execute(f"user --directory {FIXTURE_SEED_PATH} --connection sqlite") + + output = tester.io.fetch_output() + self.assertIn("UserTableSeeder seeded!", output) + self.assertEqual(CALLS, [("user_table", "sqlite")]) + + def test_runs_seeder_for_class_option_without_table_suffix(self): + tester = self._make_tester() + tester.execute(f"--directory {FIXTURE_SEED_PATH} --class SampleSeeder --connection sqlite") + + output = tester.io.fetch_output() + self.assertIn("SampleSeeder seeded!", output) + self.assertEqual(CALLS, [("sample", "sqlite")]) + + def test_runs_seeder_for_class_option_with_table_suffix(self): + tester = self._make_tester() + tester.execute(f"--directory {FIXTURE_SEED_PATH} --class UserTableSeeder --connection sqlite") + + output = tester.io.fetch_output() + self.assertIn("UserTableSeeder seeded!", output) + self.assertEqual(CALLS, [("user_table", "sqlite")]) + + def test_runs_seeder_for_fully_qualified_class_option(self): + tester = self._make_tester() + tester.execute(f"--directory {FIXTURE_SEED_PATH} --class special_seeder.SpecialSeeder --connection sqlite") + + output = tester.io.fetch_output() + self.assertIn("SpecialSeeder seeded!", output) + self.assertEqual(CALLS, [("special", "sqlite")]) + + def test_class_option_takes_precedence_over_table_argument(self): + tester = self._make_tester() + tester.execute(f"user --directory {FIXTURE_SEED_PATH} --class SampleSeeder --connection sqlite") + + output = tester.io.fetch_output() + self.assertIn("SampleSeeder seeded!", output) + self.assertEqual(CALLS, [("sample", "sqlite")]) + + def test_raises_when_seeder_class_cannot_be_found(self): + tester = self._make_tester() + + with self.assertRaises(ValueError): + tester.execute(f"--directory {FIXTURE_SEED_PATH} --class does_not_exist.NopeSeeder --connection sqlite") + + def test_raises_when_database_seeder_missing_from_directory(self): + tester = self._make_tester() + + with self.assertRaises(ValueError): + tester.execute("--directory tests.masoniteorm.commands.fixtures.databases.migrations --connection sqlite") + + def test_uses_default_connection_option(self): + tester = self._make_tester() + tester.execute(f"--directory {FIXTURE_SEED_PATH}") + + self.assertEqual(CALLS, [("database", "default")]) diff --git a/fastapi_startkit/tests/masoniteorm/seeders/__init__.py b/fastapi_startkit/tests/masoniteorm/seeders/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fastapi_startkit/tests/masoniteorm/seeders/fixtures/__init__.py b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/__init__.py b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/database_seeder.py b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/database_seeder.py new file mode 100644 index 00000000..edfb6122 --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/database_seeder.py @@ -0,0 +1,11 @@ +from fastapi_startkit.masoniteorm.seeders import Seeder + +from .first_seeder import FirstSeeder +from .recorder import CALLS +from .second_seeder import SecondSeeder + + +class DatabaseSeeder(Seeder): + async def run(self): + CALLS.append(("database_seeder_start", self.connection)) + await self.call(FirstSeeder, SecondSeeder) diff --git a/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/first_seeder.py b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/first_seeder.py new file mode 100644 index 00000000..7d9ea8ed --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/first_seeder.py @@ -0,0 +1,8 @@ +from fastapi_startkit.masoniteorm.seeders import Seeder + +from .recorder import CALLS + + +class FirstSeeder(Seeder): + async def run(self): + CALLS.append(("first", self.connection)) diff --git a/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/recorder.py b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/recorder.py new file mode 100644 index 00000000..87461b1d --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/recorder.py @@ -0,0 +1,8 @@ +"""Shared call recorder used by the fixture seeder classes below. + +Keeping this as module-level state lets tests assert both that a seeder +ran and the order in which it ran relative to others, without touching a +real database. +""" + +CALLS = [] diff --git a/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/sample_seeder.py b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/sample_seeder.py new file mode 100644 index 00000000..aa19a2b1 --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/sample_seeder.py @@ -0,0 +1,8 @@ +from fastapi_startkit.masoniteorm.seeders import Seeder + +from .recorder import CALLS + + +class SampleSeeder(Seeder): + async def run(self): + CALLS.append(("sample", self.connection)) diff --git a/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/second_seeder.py b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/second_seeder.py new file mode 100644 index 00000000..1808dcb2 --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/seeders/fixtures/seeders/second_seeder.py @@ -0,0 +1,8 @@ +from fastapi_startkit.masoniteorm.seeders import Seeder + +from .recorder import CALLS + + +class SecondSeeder(Seeder): + async def run(self): + CALLS.append(("second", self.connection)) diff --git a/fastapi_startkit/tests/masoniteorm/seeders/test_seeder.py b/fastapi_startkit/tests/masoniteorm/seeders/test_seeder.py new file mode 100644 index 00000000..b8c98af3 --- /dev/null +++ b/fastapi_startkit/tests/masoniteorm/seeders/test_seeder.py @@ -0,0 +1,91 @@ +import pytest + +from fastapi_startkit.masoniteorm.seeders import Seeder + +from .fixtures.seeders.database_seeder import DatabaseSeeder +from .fixtures.seeders.first_seeder import FirstSeeder +from .fixtures.seeders.recorder import CALLS +from .fixtures.seeders.sample_seeder import SampleSeeder +from .fixtures.seeders.second_seeder import SecondSeeder + +FIXTURE_SEED_PATH = "tests.masoniteorm.seeders.fixtures.seeders" + + +@pytest.fixture(autouse=True) +def reset_recorder(): + CALLS.clear() + yield + CALLS.clear() + + +def test_seed_module_replaces_forward_slashes_with_dots(): + seeder = Seeder(seed_path="databases/seeders") + + assert seeder.seed_module == "databases.seeders" + + +def test_seed_module_replaces_backslashes_with_dots(): + seeder = Seeder(seed_path="databases\\seeders") + + assert seeder.seed_module == "databases.seeders" + + +def test_defaults_have_no_ran_seeds(): + seeder = Seeder() + + assert seeder.ran_seeds == [] + assert seeder.connection is None + + +async def test_call_runs_seeders_in_order_with_connection(): + seeder = Seeder(connection="sqlite") + + await seeder.call(FirstSeeder, SecondSeeder) + + assert CALLS == [("first", "sqlite"), ("second", "sqlite")] + assert seeder.ran_seeds == [FirstSeeder, SecondSeeder] + + +async def test_call_appends_to_ran_seeds_for_each_invocation(): + seeder = Seeder() + + await seeder.call(FirstSeeder) + await seeder.call(SecondSeeder) + + assert seeder.ran_seeds == [FirstSeeder, SecondSeeder] + + +async def test_run_database_seed_locates_and_runs_database_seeder(): + seeder = Seeder(seed_path=FIXTURE_SEED_PATH, connection="sqlite") + + await seeder.run_database_seed() + + assert CALLS == [ + ("database_seeder_start", "sqlite"), + ("first", "sqlite"), + ("second", "sqlite"), + ] + assert seeder.ran_seeds == [DatabaseSeeder] + + +async def test_run_database_seed_raises_when_module_missing(): + seeder = Seeder(seed_path="tests.masoniteorm.seeders.fixtures.does_not_exist") + + with pytest.raises(ValueError, match="Could not find the DatabaseSeeder class"): + await seeder.run_database_seed() + + +async def test_run_specific_seed_locates_and_runs_seeder(): + seeder = Seeder(seed_path=FIXTURE_SEED_PATH, connection="sqlite") + + await seeder.run_specific_seed("sample_seeder.SampleSeeder") + + assert CALLS == [("sample", "sqlite")] + assert seeder.ran_seeds == [SampleSeeder] + + +async def test_run_specific_seed_raises_when_missing(): + seeder = Seeder(seed_path=FIXTURE_SEED_PATH) + + with pytest.raises(ValueError, match="Could not find the .* seeder file"): + await seeder.run_specific_seed("does_not_exist.NopeSeeder")