Commit a0acb263 authored by Jens Segers's avatar Jens Segers

Code style tweaks and increasing test coverage

parent f0b91050
...@@ -25,22 +25,17 @@ class DatabaseReminderRepository extends \Illuminate\Auth\Reminders\DatabaseRemi ...@@ -25,22 +25,17 @@ class DatabaseReminderRepository extends \Illuminate\Auth\Reminders\DatabaseRemi
*/ */
protected function reminderExpired($reminder) protected function reminderExpired($reminder)
{ {
// Convert to array so that we can pass it to the parent method
if (is_object($reminder))
{
$reminder = (array) $reminder;
}
// Convert MongoDate to a date string. // Convert MongoDate to a date string.
if ($reminder['created_at'] instanceof MongoDate) if ($reminder['created_at'] instanceof MongoDate)
{ {
$date = new DateTime(); $date = new DateTime;
$date->setTimestamp($reminder['created_at']->sec); $date->setTimestamp($reminder['created_at']->sec);
$reminder['created_at'] = $date->format('Y-m-d H:i:s'); $reminder['created_at'] = $date->format('Y-m-d H:i:s');
} }
// DEPRECATED: Convert DateTime to a date string. // Convert DateTime to a date string (backwards compatibility).
elseif (is_array($reminder['created_at'])) elseif (is_array($reminder['created_at']))
{ {
$date = DateTime::__set_state($reminder['created_at']); $date = DateTime::__set_state($reminder['created_at']);
......
...@@ -26,6 +26,7 @@ class Collection { ...@@ -26,6 +26,7 @@ class Collection {
public function __construct(Connection $connection, MongoCollection $collection) public function __construct(Connection $connection, MongoCollection $collection)
{ {
$this->connection = $connection; $this->connection = $connection;
$this->collection = $collection; $this->collection = $collection;
} }
...@@ -38,29 +39,34 @@ class Collection { ...@@ -38,29 +39,34 @@ class Collection {
*/ */
public function __call($method, $parameters) public function __call($method, $parameters)
{ {
$query = array();
// Build the query string. // Build the query string.
$query = $parameters; foreach ($parameters as $parameter)
foreach ($query as &$param)
{ {
try try
{ {
$param = json_encode($param); $query[] = json_encode($parameter);
} }
catch (Exception $e) catch (Exception $e)
{ {
$param = '{...}'; $query[] = '{...}';
} }
} }
$start = microtime(true); $start = microtime(true);
// Execute the query.
$result = call_user_func_array(array($this->collection, $method), $parameters); $result = call_user_func_array(array($this->collection, $method), $parameters);
// Log the query. // Once we have run the query we will calculate the time that it took to run and
$this->connection->logQuery( // then log the query, bindings, and execution time so we will report them on
$this->collection->getName() . '.' . $method . '(' . join(',', $query) . ')', // the event that the developer needs them. We'll log time in milliseconds.
array(), $this->connection->getElapsedTime($start)); $time = $this->connection->getElapsedTime($start);
// Convert the query to a readable string.
$queryString = $this->collection->getName() . '.' . $method . '(' . join(',', $query) . ')';
$this->connection->logQuery($queryString, array(), $time);
return $result; return $result;
} }
......
...@@ -116,6 +116,7 @@ class Builder extends EloquentBuilder { ...@@ -116,6 +116,7 @@ class Builder extends EloquentBuilder {
// sync the original attributes. We need to change the attribute // sync the original attributes. We need to change the attribute
// temporary in order to trigger an update query. // temporary in order to trigger an update query.
$this->model->{$column} = null; $this->model->{$column} = null;
$this->model->syncOriginalAttribute($column); $this->model->syncOriginalAttribute($column);
$result = $this->model->update(array($column => $value)); $result = $this->model->update(array($column => $value));
...@@ -146,6 +147,7 @@ class Builder extends EloquentBuilder { ...@@ -146,6 +147,7 @@ class Builder extends EloquentBuilder {
// sync the original attributes. We need to change the attribute // sync the original attributes. We need to change the attribute
// temporary in order to trigger an update query. // temporary in order to trigger an update query.
$this->model->{$column} = null; $this->model->{$column} = null;
$this->model->syncOriginalAttribute($column); $this->model->syncOriginalAttribute($column);
return $this->model->update(array($column => $value)); return $this->model->update(array($column => $value));
......
<?php namespace Jenssegers\Mongodb\Eloquent; <?php namespace Jenssegers\Mongodb\Eloquent;
use Illuminate\Database\Eloquent\Collection as BaseCollection; use Illuminate\Database\Eloquent\Collection as EloquentCollection;
class Collection extends BaseCollection { class Collection extends EloquentCollection {
/** /**
* Simulate a get clause on the collection. * Simulate a get clause on the collection.
...@@ -63,6 +63,10 @@ class Collection extends BaseCollection { ...@@ -63,6 +63,10 @@ class Collection extends BaseCollection {
return $actual >= $value; return $actual >= $value;
break; break;
case '<=':
return $actual <= $value;
break;
case 'between': case 'between':
return $actual >= $value[0] and $actual <= $value[1]; return $actual >= $value[0] and $actual <= $value[1];
break; break;
......
...@@ -269,12 +269,8 @@ abstract class Model extends \Jenssegers\Eloquent\Model { ...@@ -269,12 +269,8 @@ abstract class Model extends \Jenssegers\Eloquent\Model {
*/ */
protected function getAttributeFromArray($key) protected function getAttributeFromArray($key)
{ {
if (array_key_exists($key, $this->attributes)) // Support keys in dot notation.
{ if (str_contains($key, '.'))
return $this->attributes[$key];
}
elseif (str_contains($key, '.'))
{ {
$attributes = array_dot($this->attributes); $attributes = array_dot($this->attributes);
...@@ -283,6 +279,8 @@ abstract class Model extends \Jenssegers\Eloquent\Model { ...@@ -283,6 +279,8 @@ abstract class Model extends \Jenssegers\Eloquent\Model {
return $attributes[$key]; return $attributes[$key];
} }
} }
return parent::getAttributeFromArray($key);
} }
/** /**
...@@ -380,10 +378,8 @@ abstract class Model extends \Jenssegers\Eloquent\Model { ...@@ -380,10 +378,8 @@ abstract class Model extends \Jenssegers\Eloquent\Model {
list($column, $values) = $parameters; list($column, $values) = $parameters;
} }
if ( ! is_array($values)) // Do batch push by default.
{ if ( ! is_array($values)) $values = array($values);
$values = array($values);
}
$query = $this->setKeysForSaveQuery($this->newQuery()); $query = $this->setKeysForSaveQuery($this->newQuery());
...@@ -402,10 +398,8 @@ abstract class Model extends \Jenssegers\Eloquent\Model { ...@@ -402,10 +398,8 @@ abstract class Model extends \Jenssegers\Eloquent\Model {
*/ */
public function pull($column, $values) public function pull($column, $values)
{ {
if ( ! is_array($values)) // Do batch pull by default.
{ if ( ! is_array($values)) $values = array($values);
$values = array($values);
}
$query = $this->setKeysForSaveQuery($this->newQuery()); $query = $this->setKeysForSaveQuery($this->newQuery());
......
...@@ -6,10 +6,11 @@ use MongoDate; ...@@ -6,10 +6,11 @@ use MongoDate;
use DateTime; use DateTime;
use Closure; use Closure;
use Illuminate\Database\Query\Builder as QueryBuilder;
use Illuminate\Database\Query\Expression; use Illuminate\Database\Query\Expression;
use Jenssegers\Mongodb\Connection; use Jenssegers\Mongodb\Connection;
class Builder extends \Illuminate\Database\Query\Builder { class Builder extends QueryBuilder {
/** /**
* The database collection * The database collection
...@@ -193,6 +194,7 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -193,6 +194,7 @@ class Builder extends \Illuminate\Database\Query\Builder {
foreach ($this->columns as $column) foreach ($this->columns as $column)
{ {
$key = str_replace('.', '_', $column); $key = str_replace('.', '_', $column);
$group[$key] = array('$last' => '$' . $column); $group[$key] = array('$last' => '$' . $column);
} }
} }
...@@ -374,17 +376,18 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -374,17 +376,18 @@ class Builder extends \Illuminate\Database\Query\Builder {
// Since every insert gets treated like a batch insert, we will have to detect // Since every insert gets treated like a batch insert, we will have to detect
// if the user is inserting a single document or an array of documents. // if the user is inserting a single document or an array of documents.
$batch = true; $batch = true;
foreach ($values as $value) foreach ($values as $value)
{ {
// As soon as we find a value that is not an array we assume the user is // As soon as we find a value that is not an array we assume the user is
// inserting a single document. // inserting a single document.
if (!is_array($value)) if ( ! is_array($value))
{ {
$batch = false; break; $batch = false; break;
} }
} }
if (!$batch) $values = array($values); if ( ! $batch) $values = array($values);
// Batch insert // Batch insert
$result = $this->collection->batchInsert($values); $result = $this->collection->batchInsert($values);
...@@ -405,7 +408,7 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -405,7 +408,7 @@ class Builder extends \Illuminate\Database\Query\Builder {
if (1 == (int) $result['ok']) if (1 == (int) $result['ok'])
{ {
if (!$sequence) if (is_null($sequence))
{ {
$sequence = '_id'; $sequence = '_id';
} }
...@@ -454,6 +457,7 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -454,6 +457,7 @@ class Builder extends \Illuminate\Database\Query\Builder {
$this->where(function($query) use ($column) $this->where(function($query) use ($column)
{ {
$query->where($column, 'exists', false); $query->where($column, 'exists', false);
$query->orWhereNotNull($column); $query->orWhereNotNull($column);
}); });
...@@ -502,6 +506,7 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -502,6 +506,7 @@ class Builder extends \Illuminate\Database\Query\Builder {
public function delete($id = null) public function delete($id = null)
{ {
$wheres = $this->compileWheres(); $wheres = $this->compileWheres();
$result = $this->collection->remove($wheres); $result = $this->collection->remove($wheres);
if (1 == (int) $result['ok']) if (1 == (int) $result['ok'])
...@@ -577,13 +582,13 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -577,13 +582,13 @@ class Builder extends \Illuminate\Database\Query\Builder {
$operator = $unique ? '$addToSet' : '$push'; $operator = $unique ? '$addToSet' : '$push';
// Check if we are pushing multiple values. // Check if we are pushing multiple values.
$multipleValues = (is_array($value) and array_keys($value) === range(0, count($value) - 1)); $batch = (is_array($value) and array_keys($value) === range(0, count($value) - 1));
if (is_array($column)) if (is_array($column))
{ {
$query = array($operator => $column); $query = array($operator => $column);
} }
else if ($multipleValues) else if ($batch)
{ {
$query = array($operator => array($column => array('$each' => $value))); $query = array($operator => array($column => array('$each' => $value)));
} }
...@@ -605,10 +610,10 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -605,10 +610,10 @@ class Builder extends \Illuminate\Database\Query\Builder {
public function pull($column, $value = null) public function pull($column, $value = null)
{ {
// Check if we passed an associative array. // Check if we passed an associative array.
$multipleValues = (is_array($value) and array_keys($value) === range(0, count($value) - 1)); $batch = (is_array($value) and array_keys($value) === range(0, count($value) - 1));
// If we are pulling multiple values, we need to use $pullAll. // If we are pulling multiple values, we need to use $pullAll.
$operator = $multipleValues ? '$pullAll' : '$pull'; $operator = $batch ? '$pullAll' : '$pull';
if (is_array($column)) if (is_array($column))
{ {
......
...@@ -131,21 +131,4 @@ class EmbedsOne extends EmbedsOneOrMany { ...@@ -131,21 +131,4 @@ class EmbedsOne extends EmbedsOneOrMany {
return $this->performDelete($model); return $this->performDelete($model);
} }
/**
* Check if a model is already embedded.
*
* @param mixed $key
* @return bool
*/
public function contains($key)
{
if ($key instanceof Model) $key = $key->getKey();
$embedded = $this->getEmbedded();
$primaryKey = $this->related->getKeyName();
return ($embedded and $embedded[$primaryKey] == $key);
}
} }
...@@ -36,6 +36,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint { ...@@ -36,6 +36,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
public function __construct(Connection $connection, $collection) public function __construct(Connection $connection, $collection)
{ {
$this->connection = $connection; $this->connection = $connection;
$this->collection = $connection->getCollection($collection); $this->collection = $connection->getCollection($collection);
} }
...@@ -50,11 +51,12 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint { ...@@ -50,11 +51,12 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
{ {
$columns = $this->fluent($columns); $columns = $this->fluent($columns);
// Columns are passed as a default array // Columns are passed as a default array.
if (is_array($columns) && is_int(key($columns))) if (is_array($columns) && is_int(key($columns)))
{ {
// Transform the columns to the required array format // Transform the columns to the required array format.
$transform = array(); $transform = array();
foreach ($columns as $column) foreach ($columns as $column)
{ {
$transform[$column] = 1; $transform[$column] = 1;
...@@ -78,11 +80,12 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint { ...@@ -78,11 +80,12 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
{ {
$columns = $this->fluent($columns); $columns = $this->fluent($columns);
// Columns are passed as a default array // Columns are passed as a default array.
if (is_array($columns) && is_int(key($columns))) if (is_array($columns) && is_int(key($columns)))
{ {
// Transform the columns to the required array format // Transform the columns to the required array format.
$transform = array(); $transform = array();
foreach ($columns as $column) foreach ($columns as $column)
{ {
$transform[$column] = 1; $transform[$column] = 1;
...@@ -105,6 +108,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint { ...@@ -105,6 +108,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
public function unique($columns = null, $name = null) public function unique($columns = null, $name = null)
{ {
$columns = $this->fluent($columns); $columns = $this->fluent($columns);
$this->index($columns, array('unique' => true)); $this->index($columns, array('unique' => true));
return $this; return $this;
...@@ -119,6 +123,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint { ...@@ -119,6 +123,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
public function background($columns = null) public function background($columns = null)
{ {
$columns = $this->fluent($columns); $columns = $this->fluent($columns);
$this->index($columns, array('background' => true)); $this->index($columns, array('background' => true));
return $this; return $this;
...@@ -149,6 +154,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint { ...@@ -149,6 +154,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
public function expire($columns, $seconds) public function expire($columns, $seconds)
{ {
$columns = $this->fluent($columns); $columns = $this->fluent($columns);
$this->index($columns, array('expireAfterSeconds' => $seconds)); $this->index($columns, array('expireAfterSeconds' => $seconds));
return $this; return $this;
...@@ -163,8 +169,9 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint { ...@@ -163,8 +169,9 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
{ {
$collection = $this->collection->getName(); $collection = $this->collection->getName();
// Ensure the collection is created
$db = $this->connection->getMongoDB(); $db = $this->connection->getMongoDB();
// Ensure the collection is created.
$db->createCollection($collection); $db->createCollection($collection);
} }
...@@ -189,6 +196,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint { ...@@ -189,6 +196,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
protected function addColumn($type, $name, array $parameters = array()) protected function addColumn($type, $name, array $parameters = array())
{ {
$this->fluent($name); $this->fluent($name);
return $this; return $this;
} }
...@@ -221,6 +229,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint { ...@@ -221,6 +229,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
*/ */
public function __call($method, $args) public function __call($method, $args)
{ {
// Dummy.
return $this; return $this;
} }
......
...@@ -57,4 +57,39 @@ class AuthTest extends TestCase { ...@@ -57,4 +57,39 @@ class AuthTest extends TestCase {
$this->assertEquals(0, DB::collection('password_reminders')->count()); $this->assertEquals(0, DB::collection('password_reminders')->count());
} }
public function testDeprecatedRemind()
{
$mailer = Mockery::mock('Illuminate\Mail\Mailer');
$this->app->instance('mailer', $mailer);
$user = User::create(array(
'name' => 'John Doe',
'email' => 'john@doe.com',
'password' => Hash::make('foobar')
));
$mailer->shouldReceive('send')->once();
Password::remind(array('email' => 'john@doe.com'));
DB::collection('password_reminders')->update(array('created_at' => new DateTime));
$reminder = DB::collection('password_reminders')->first();
$this->assertTrue(is_array($reminder['created_at']));
$credentials = array(
'email' => 'john@doe.com',
'password' => 'foobar',
'password_confirmation' => 'foobar',
'token' => $reminder['token']
);
$response = Password::reset($credentials, function($user, $password)
{
$user->password = Hash::make($password);
$user->save();
});
$this->assertEquals('reminders.reset', $response);
$this->assertEquals(0, DB::collection('password_reminders')->count());
}
} }
...@@ -416,10 +416,10 @@ class EmbeddedRelationsTest extends TestCase { ...@@ -416,10 +416,10 @@ class EmbeddedRelationsTest extends TestCase {
public function testEmbedsManyCollectionMethods() public function testEmbedsManyCollectionMethods()
{ {
$user = User::create(array('name' => 'John Doe')); $user = User::create(array('name' => 'John Doe'));
$user->addresses()->save(new Address(array('city' => 'Paris', 'country' => 'France'))); $user->addresses()->save(new Address(array('city' => 'Paris', 'country' => 'France', 'visited' => 4)));
$user->addresses()->save(new Address(array('city' => 'Bruges', 'country' => 'Belgium'))); $user->addresses()->save(new Address(array('city' => 'Bruges', 'country' => 'Belgium', 'visited' => 7)));
$user->addresses()->save(new Address(array('city' => 'Brussels', 'country' => 'Belgium'))); $user->addresses()->save(new Address(array('city' => 'Brussels', 'country' => 'Belgium', 'visited' => 2)));
$user->addresses()->save(new Address(array('city' => 'Ghent', 'country' => 'Belgium'))); $user->addresses()->save(new Address(array('city' => 'Ghent', 'country' => 'Belgium', 'visited' => 13)));
$this->assertEquals(array('Paris', 'Bruges', 'Brussels', 'Ghent'), $user->addresses()->lists('city')); $this->assertEquals(array('Paris', 'Bruges', 'Brussels', 'Ghent'), $user->addresses()->lists('city'));
$this->assertEquals(array('Bruges', 'Brussels', 'Ghent', 'Paris'), $user->addresses()->sortBy('city')->lists('city')); $this->assertEquals(array('Bruges', 'Brussels', 'Ghent', 'Paris'), $user->addresses()->sortBy('city')->lists('city'));
...@@ -433,6 +433,24 @@ class EmbeddedRelationsTest extends TestCase { ...@@ -433,6 +433,24 @@ class EmbeddedRelationsTest extends TestCase {
$results = $user->addresses()->where('country', 'Belgium')->get(); $results = $user->addresses()->where('country', 'Belgium')->get();
$this->assertInstanceOf('Jenssegers\Mongodb\Eloquent\Collection', $results); $this->assertInstanceOf('Jenssegers\Mongodb\Eloquent\Collection', $results);
$this->assertEquals(3, $results->count()); $this->assertEquals(3, $results->count());
$results = $user->addresses()->where('country', '!=', 'Belgium')->get();
$this->assertEquals(1, $results->count());
$results = $user->addresses()->where('visited', '>', 4)->get();
$this->assertEquals(2, $results->count());
$results = $user->addresses()->where('visited', '<', 7)->get();
$this->assertEquals(2, $results->count());
$results = $user->addresses()->where('visited', '<=', 7)->get();
$this->assertEquals(3, $results->count());
$results = $user->addresses()->where('visited', '>=', 7)->get();
$this->assertEquals(2, $results->count());
$results = $user->addresses()->where('visited', 'between', array(4, 7))->get();
$this->assertEquals(2, $results->count());
} }
public function testEmbedsOne() public function testEmbedsOne()
...@@ -671,6 +689,13 @@ class EmbeddedRelationsTest extends TestCase { ...@@ -671,6 +689,13 @@ class EmbeddedRelationsTest extends TestCase {
$user = User::where('name', 'John Doe')->first(); $user = User::where('name', 'John Doe')->first();
$this->assertEquals(6, $user->addresses()->first()->visited); $this->assertEquals(6, $user->addresses()->first()->visited);
$address->decrement('visited');
$this->assertEquals(5, $address->visited);
//$this->assertEquals(5, $user->addresses()->first()->visited); TODO
$user = User::where('name', 'John Doe')->first();
$this->assertEquals(5, $user->addresses()->first()->visited);
} }
public function testPaginateEmbedsMany() public function testPaginateEmbedsMany()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment