id = $attributes['id'] ?? null; $this->name = $attributes['name'] ?? null; $this->email = $attributes['email'] ?? null; } } class UserFeatureDAO extends BaseDAO { protected string $table = 'users'; protected ?string $dtoClass = UserFeatureDTO::class; public function scopeActive($builder) { return $builder->where('status', 'active'); } } class DaoQueryTest extends TestCase { protected $db; protected $dao; protected function setUp(): void { $config = [ 'default' => 'default', 'connections' => [ 'default' => [ 'driver' => 'sqlite', 'database' => ':memory:', ], ], ]; $this->db = new DatabaseManager($config); $this->db->connection()->execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT, status TEXT)'); $identityMap = new IdentityMap(); $this->dao = new UserFeatureDAO($this->db, $identityMap); } public function test_it_executes_queries_via_dao() { $this->db->connection()->execute('INSERT INTO users (name, email, status) VALUES (?, ?, ?)', ['Alice', 'alice@example.com', 'active']); $this->db->connection()->execute('INSERT INTO users (name, email, status) VALUES (?, ?, ?)', ['Bob', 'bob@example.com', 'inactive']); $users = $this->dao->query()->get(); $this->assertCount(2, $users); $this->assertInstanceOf(UserFeatureDTO::class, $users[0]); $this->assertEquals('Alice', $users[0]->name); } public function test_it_uses_scopes() { $this->db->connection()->execute('INSERT INTO users (name, email, status) VALUES (?, ?, ?)', ['Alice', 'alice@example.com', 'active']); $this->db->connection()->execute('INSERT INTO users (name, email, status) VALUES (?, ?, ?)', ['Bob', 'bob@example.com', 'inactive']); $activeUsers = $this->dao->query()->active()->get(); $this->assertCount(1, $activeUsers); $this->assertEquals('Alice', $activeUsers[0]->name); } public function test_it_paginates_results() { for ($i = 1; $i <= 20; $i++) { $this->db->connection()->execute('INSERT INTO users (name, email, status) VALUES (?, ?, ?)', ["User $i", "user$i@example.com", 'active']); } $paginator = $this->dao->query()->paginate(5, 2); $this->assertInstanceOf(Paginator::class, $paginator); $this->assertEquals(20, $paginator->total()); $this->assertCount(5, $paginator->items()); $this->assertEquals(2, $paginator->currentPage()); $this->assertEquals(4, $paginator->lastPage()); $this->assertEquals('User 6', $paginator->items()[0]->name); } }