RelationsTest.php 9.57 KB
Newer Older
Jens Segers's avatar
Jens Segers committed
1 2 3 4
<?php

class RelationsTest extends PHPUnit_Framework_TestCase {

5
    public function setUp() {
unknown's avatar
unknown committed
6 7 8 9
    }

    public function tearDown()
    {
10 11 12 13 14
        User::truncate();
        Book::truncate();
        Item::truncate();
        Role::truncate();
        Client::truncate();
15
        Group::truncate();
unknown's avatar
unknown committed
16 17 18 19
    }

    public function testHasMany()
    {
20 21 22
        $author = User::create(array('name' => 'George R. R. Martin'));
        Book::create(array('title' => 'A Game of Thrones', 'author_id' => $author->_id));
        Book::create(array('title' => 'A Clash of Kings', 'author_id' => $author->_id));
unknown's avatar
unknown committed
23

24 25
        $books = $author->books;
        $this->assertEquals(2, count($books));
unknown's avatar
unknown committed
26

27 28 29 30 31
        $user = User::create(array('name' => 'John Doe'));
        Item::create(array('type' => 'knife', 'user_id' => $user->_id));
        Item::create(array('type' => 'shield', 'user_id' => $user->_id));
        Item::create(array('type' => 'sword', 'user_id' => $user->_id));
        Item::create(array('type' => 'bag', 'user_id' => null));
unknown's avatar
unknown committed
32

33 34 35
        $items = $user->items;
        $this->assertEquals(3, count($items));
}
unknown's avatar
unknown committed
36 37 38

    public function testBelongsTo()
    {
39 40 41
        $user = User::create(array('name' => 'George R. R. Martin'));
        Book::create(array('title' => 'A Game of Thrones', 'author_id' => $user->_id));
        $book = Book::create(array('title' => 'A Clash of Kings', 'author_id' => $user->_id));
unknown's avatar
unknown committed
42

43 44
        $author = $book->author;
        $this->assertEquals('George R. R. Martin', $author->name);
unknown's avatar
unknown committed
45

46 47
        $user = User::create(array('name' => 'John Doe'));
        $item = Item::create(array('type' => 'sword', 'user_id' => $user->_id));
unknown's avatar
unknown committed
48

49 50
        $owner = $item->user;
        $this->assertEquals('John Doe', $owner->name);
unknown's avatar
unknown committed
51 52 53 54
    }

    public function testHasOne()
    {
55 56
        $user = User::create(array('name' => 'John Doe'));
        Role::create(array('type' => 'admin', 'user_id' => $user->_id));
unknown's avatar
unknown committed
57

58 59
        $role = $user->role;
        $this->assertEquals('admin', $role->type);
unknown's avatar
unknown committed
60 61 62 63
    }

    public function testWithBelongsTo()
    {
64 65 66 67 68 69 70 71 72 73 74 75 76
        $user = User::create(array('name' => 'John Doe'));
        Item::create(array('type' => 'knife', 'user_id' => $user->_id));
        Item::create(array('type' => 'shield', 'user_id' => $user->_id));
        Item::create(array('type' => 'sword', 'user_id' => $user->_id));
        Item::create(array('type' => 'bag', 'user_id' => null));

        $items = Item::with('user')->get();

        $user = $items[0]->getRelation('user');
        $this->assertInstanceOf('User', $user);
        $this->assertEquals('John Doe', $user->name);
        $this->assertEquals(1, count($items[0]->getRelations()));
        $this->assertEquals(null, $items[3]->getRelation('user'));
unknown's avatar
unknown committed
77 78 79 80
    }

    public function testWithHashMany()
    {
81 82 83 84 85
        $user = User::create(array('name' => 'John Doe'));
        Item::create(array('type' => 'knife', 'user_id' => $user->_id));
        Item::create(array('type' => 'shield', 'user_id' => $user->_id));
        Item::create(array('type' => 'sword', 'user_id' => $user->_id));
        Item::create(array('type' => 'bag', 'user_id' => null));
unknown's avatar
unknown committed
86

87
        $user = User::with('items')->find($user->_id);
unknown's avatar
unknown committed
88

89 90 91
        $items = $user->getRelation('items');
        $this->assertEquals(3, count($items));
        $this->assertInstanceOf('Item', $items[0]);
unknown's avatar
unknown committed
92 93 94 95
    }

    public function testWithHasOne()
    {
96 97 98
        $user = User::create(array('name' => 'John Doe'));
        Role::create(array('type' => 'admin', 'user_id' => $user->_id));
        Role::create(array('type' => 'guest', 'user_id' => $user->_id));
unknown's avatar
unknown committed
99

100
        $user = User::with('role')->find($user->_id);
unknown's avatar
unknown committed
101

102 103 104
        $role = $user->getRelation('role');
        $this->assertInstanceOf('Role', $role);
        $this->assertEquals('admin', $role->type);
unknown's avatar
unknown committed
105 106 107 108
    }

    public function testEasyRelation()
    {
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
        // Has Many
        $user = User::create(array('name' => 'John Doe'));
        $item = Item::create(array('type' => 'knife'));
        $user->items()->save($item);

        $user = User::find($user->_id);
        $items = $user->items;
        $this->assertEquals(1, count($items));
        $this->assertInstanceOf('Item', $items[0]);

        // Has one
        $user = User::create(array('name' => 'John Doe'));
        $role = Role::create(array('type' => 'admin'));
        $user->role()->save($role);

        $user = User::find($user->_id);
        $role = $user->role;
        $this->assertInstanceOf('Role', $role);
        $this->assertEquals('admin', $role->type);
    }

130
    public function testBelongsToMany()
131 132 133
    {
        $user = User::create(array('name' => 'John Doe'));

134
        // Add 2 clients
135 136 137
        $user->clients()->save(new Client(array('name' => 'Pork Pies Ltd.')));
        $user->clients()->create(array('name' => 'Buffet Bar Inc.'));

138
        // Refetch
139 140 141
        $user = User::with('clients')->find($user->_id);
        $client = Client::with('users')->first();

142 143 144 145
        // Check for relation attributes
        $this->assertTrue(array_key_exists('user_ids', $client->getAttributes()));
        $this->assertTrue(array_key_exists('client_ids', $user->getAttributes()));

146 147 148 149 150 151 152 153 154 155 156
        $clients = $client->getRelation('users');
        $users = $user->getRelation('clients');

        $this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $users);
        $this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $clients);
        $this->assertInstanceOf('Client', $users[0]);
        $this->assertInstanceOf('User', $clients[0]);
        $this->assertCount(2, $user->clients);
        $this->assertCount(1, $client->users);

        // Now create a new user to an existing client
Jens Segers's avatar
Jens Segers committed
157
        $user = $client->users()->create(array('name' => 'Jane Doe'));
158

Jens Segers's avatar
Jens Segers committed
159 160 161
        $this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $user->clients);
        $this->assertInstanceOf('Client', $user->clients->first());
        $this->assertCount(1, $user->clients);
162

Jens Segers's avatar
Jens Segers committed
163
        // Get user and unattached client
164 165 166 167 168 169 170 171 172 173
        $user = User::where('name', '=', 'Jane Doe')->first();
        $client = Client::Where('name', '=', 'Buffet Bar Inc.')->first();

        // Check the models are what they should be
        $this->assertInstanceOf('Client', $client);
        $this->assertInstanceOf('User', $user);

        // Assert they are not attached
        $this->assertFalse(in_array($client->_id, $user->client_ids));
        $this->assertFalse(in_array($user->_id, $client->user_ids));
Jens Segers's avatar
Jens Segers committed
174 175
        $this->assertCount(1, $user->clients);
        $this->assertCount(1, $client->users);
176 177 178 179 180 181 182 183 184 185 186

        // Attach the client to the user
        $user->clients()->attach($client);

        // Get the new user model
        $user = User::where('name', '=', 'Jane Doe')->first();
        $client = Client::Where('name', '=', 'Buffet Bar Inc.')->first();

        // Assert they are attached
        $this->assertTrue(in_array($client->_id, $user->client_ids));
        $this->assertTrue(in_array($user->_id, $client->user_ids));
Jens Segers's avatar
Jens Segers committed
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
        $this->assertCount(2, $user->clients);
        $this->assertCount(2, $client->users);

        // Detach clients from user
        $user->clients()->sync(array());

        // Get the new user model
        $user = User::where('name', '=', 'Jane Doe')->first();
        $client = Client::Where('name', '=', 'Buffet Bar Inc.')->first();

        // Assert they are not attached
        $this->assertFalse(in_array($client->_id, $user->client_ids));
        $this->assertFalse(in_array($user->_id, $client->user_ids));
        $this->assertCount(0, $user->clients);
        $this->assertCount(1, $client->users);
202 203
    }

204
    public function testBelongsToManyAttachesExistingModels()
205 206 207 208 209 210 211 212 213
    {
        $user = User::create(array('name' => 'John Doe', 'client_ids' => array('1234523')));

        $clients = array(
            Client::create(array('name' => 'Pork Pies Ltd.'))->_id,
            Client::create(array('name' => 'Buffet Bar Inc.'))->_id
        );

        $moreClients = array(
unknown's avatar
unknown committed
214 215
            Client::create(array('name' => 'synced Boloni Ltd.'))->_id,
            Client::create(array('name' => 'synced Meatballs Inc.'))->_id
216 217 218 219 220 221 222 223 224 225 226 227 228
        );

        // Sync multiple records
        $user->clients()->sync($clients);

        $user = User::with('clients')->find($user->_id);

        // Assert non attached ID's are detached succesfully
        $this->assertFalse(in_array('1234523', $user->client_ids));

        // Assert there are two client objects in the relationship
        $this->assertCount(2, $user->clients);

Jens Segers's avatar
Jens Segers committed
229
        // Add more clients
230 231
        $user->clients()->sync($moreClients);

232
        // Refetch
233 234
        $user = User::with('clients')->find($user->_id);

unknown's avatar
unknown committed
235 236
        // Assert there are now still 2 client objects in the relationship
        $this->assertCount(2, $user->clients);
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260

        // Assert that the new relationships name start with synced
        $this->assertStringStartsWith('synced', $user->clients[0]->name);
        $this->assertStringStartsWith('synced', $user->clients[1]->name);
    }

    public function testBelongsToManyCustom()
    {
        $user = User::create(array('name' => 'John Doe'));
        $group = $user->groups()->create(array('name' => 'Admins'));

        // Refetch
        $user = User::find($user->_id);
        $group = Group::find($group->_id);

        // Check for custom relation attributes
        $this->assertTrue(array_key_exists('users', $group->getAttributes()));
        $this->assertTrue(array_key_exists('groups', $user->getAttributes()));

        // Assert they are attached
        $this->assertTrue(in_array($group->_id, $user->groups));
        $this->assertTrue(in_array($user->_id, $group->users));
        $this->assertEquals($group->_id, $user->groups()->first()->_id);
        $this->assertEquals($user->_id, $group->users()->first()->_id);
unknown's avatar
unknown committed
261
    }
262
}