diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/model.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/model.py index 2e6d377f..aee8dfaa 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/model.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/model.py @@ -316,6 +316,10 @@ async def create(cls, attributes: dict): return instance + @classmethod + async def insert(cls, values: dict | list) -> int | None: + return await cls.query().insert(values) + async def update(self, attributes: dict) -> bool: if not self._exists: return False diff --git a/fastapi_startkit/tests/masoniteorm/postgres/grammar/test_postgres_insert_grammar.py b/fastapi_startkit/tests/masoniteorm/postgres/grammar/test_postgres_insert_grammar.py index 382daf0d..da3eb178 100644 --- a/fastapi_startkit/tests/masoniteorm/postgres/grammar/test_postgres_insert_grammar.py +++ b/fastapi_startkit/tests/masoniteorm/postgres/grammar/test_postgres_insert_grammar.py @@ -27,8 +27,7 @@ def test_compile_bulk_create_builds_multi_row_insert(self): self.assertEqual( sql, - 'INSERT INTO "users" ("name", "email") VALUES ' - "('Joe', 'joe@example.com'), ('Bob', 'bob@example.com')", + "INSERT INTO \"users\" (\"name\", \"email\") VALUES ('Joe', 'joe@example.com'), ('Bob', 'bob@example.com')", ) diff --git a/fastapi_startkit/tests/masoniteorm/postgres/models/test_model.py b/fastapi_startkit/tests/masoniteorm/postgres/models/test_model.py index 0595cef2..b5a48c57 100644 --- a/fastapi_startkit/tests/masoniteorm/postgres/models/test_model.py +++ b/fastapi_startkit/tests/masoniteorm/postgres/models/test_model.py @@ -133,3 +133,24 @@ async def test_count_returns_correct_number(self): count = await User.count() self.assertEqual(count, 2) + + async def test_insert_single_row(self): + await User.insert({"name": "Olivia", "email": "olivia@example.com", "is_admin": False}) + + user = await User.where("email", "olivia@example.com").first() + self.assertIsNotNone(user) + self.assertEqual(user.name, "Olivia") + + async def test_insert_bulk_rows(self): + await User.insert( + [ + {"name": "Peggy", "email": "peggy@example.com", "is_admin": False}, + {"name": "Quentin", "email": "quentin@example.com", "is_admin": True}, + ] + ) + + count = await User.count() + self.assertEqual(count, 2) + + admin = await User.where("is_admin", True).first() + self.assertEqual(admin.name, "Quentin") diff --git a/fastapi_startkit/tests/masoniteorm/sqlite/builder/test_sqlite_builder_insert.py b/fastapi_startkit/tests/masoniteorm/sqlite/builder/test_sqlite_builder_insert.py index 8b843b1b..c04c53f1 100644 --- a/fastapi_startkit/tests/masoniteorm/sqlite/builder/test_sqlite_builder_insert.py +++ b/fastapi_startkit/tests/masoniteorm/sqlite/builder/test_sqlite_builder_insert.py @@ -38,3 +38,18 @@ async def test_bulk_insert_sql_multiple(self): sql, bindings = mock_insert.call_args[0] self.assertEqual(sql, 'INSERT INTO "users" ("name") VALUES (?), (?), (?)') self.assertEqual(list(bindings), ["Joe", "Bill", "John"]) + + async def test_insert_classmethod_single_row(self): + await User.insert({"email": "classmethod@test.com", "name": "CM User", "is_admin": False}) + user = await User.where("email", "classmethod@test.com").first() + assert user is not None + assert user.name == "CM User" + + async def test_insert_classmethod_bulk_rows(self): + mock_insert = AsyncMock(return_value=2) + DB.connection("sqlite").insert = mock_insert + await User.insert([{"name": "Alice"}, {"name": "Bob"}]) + mock_insert.assert_called_once() + sql, bindings = mock_insert.call_args[0] + self.assertEqual(sql, 'INSERT INTO "users" ("name") VALUES (?), (?)') + self.assertEqual(list(bindings), ["Alice", "Bob"])