public function testAtomicOperations() { $db = new Persistence_SQL($this->db->connection); $a = ['item' => [['name' => 'John'], ['name' => 'Sue'], ['name' => 'Smith']]]; $this->setDB($a); $m = new Model($db, 'item'); $m->addField('name'); $m->load(2); $m->addHook('afterSave', function ($m) { throw new \Exception('Awful thing happened'); }); $m['name'] = 'XXX'; try { $m->save(); } catch (\Exception $e) { } $this->assertEquals('Sue', $this->getDB()['item'][2]['name']); $m->addHook('afterDelete', function ($m) { throw new \Exception('Awful thing happened'); }); try { $m->delete(); } catch (\Exception $e) { } $this->assertEquals('Sue', $this->getDB()['item'][2]['name']); }
public function testUpdateArray() { $a = ['user' => [1 => ['name' => 'John', 'surname' => 'Smith'], 2 => ['name' => 'Sarah', 'surname' => 'Jones']]]; $p = new Persistence_Array($a); $m = new Model($p, 'user'); $m->addField('name'); $m->addField('surname'); $m->load(1); $m['name'] = 'Peter'; $m->save(); $m->load(2); $m['surname'] = 'Smith'; $m->save(); $m['surname'] = 'QQ'; $m->save(); $this->assertEquals(['user' => [1 => ['name' => 'Peter', 'surname' => 'Smith'], 2 => ['name' => 'Sarah', 'surname' => 'QQ']]], $a); $m->unload(); $m->set(['name' => 'Foo', 'surname' => 'Bar']); $m->save(); $this->assertEquals(['user' => [1 => ['name' => 'Peter', 'surname' => 'Smith'], 2 => ['name' => 'Sarah', 'surname' => 'QQ'], 3 => ['name' => 'Foo', 'surname' => 'Bar', 'id' => 3]]], $a); }
public function testBasicJoin() { $a = ['user' => [], 'contact' => []]; $db = new Persistence_Array($a); $m = new Model($db, 'user'); $m->addField('name'); $j = $m->join('contact'); $j->addField('contact_phone'); $m['name'] = 'John'; $m['contact_phone'] = '+123'; $m->save(); /* $this->assertEquals([ 'user'=>[ 1=>['name'=>'John','contact_id'=>1] ],'contact'=>[ 1=>['contact_phone'=>'+123' ]]], $a); )*/ }
/** * Test constructor. */ public function testLoadArray() { $a = ['user' => [1 => ['name' => 'John', 'surname' => 'Smith'], 2 => ['name' => 'Sarah', 'surname' => 'Jones']]]; $p = new Persistence_SQL('sqlite::memory:'); $p->connection->expr('drop table if exists user')->execute(); $p->connection->expr('create table user(id int, name varchar(255), surname varchar(255))')->execute(); foreach ($a['user'] as $id => $row) { $row['id'] = $id; $p->connection->expr('insert into user values([id], [name], [surname])', $row)->execute(); } $m = new Model($p, 'user'); $m->addField('name'); $m->addField('surname'); $m->load(1); $this->assertEquals('John', $m['name']); $m->load(2); $this->assertEquals('Jones', $m['surname']); $m['surname'] = 'Smith'; $m->save(); $m->load(1); $this->assertEquals('John', $m['name']); $m->load(2); $this->assertEquals('Smith', $m['surname']); }
public function testDoubleJoin() { $a = ['user' => [10 => ['id' => 10, 'name' => 'John 2', 'contact_id' => 100], 20 => ['id' => 20, 'name' => 'Peter', 'contact_id' => 100], 30 => ['id' => 30, 'name' => 'XX', 'contact_id' => 200], 40 => ['id' => 40, 'name' => 'YYY', 'contact_id' => 300]], 'contact' => [100 => ['id' => 100, 'contact_phone' => '+555', 'country_id' => 1], 200 => ['id' => 200, 'contact_phone' => '+999', 'country_id' => 2], 300 => ['id' => 300, 'contact_phone' => '+777', 'country_id' => 5]], 'country' => [1 => ['id' => 1, 'name' => 'UK'], 2 => ['id' => 2, 'name' => 'US'], 3 => ['id' => 3, 'name' => 'India']]]; $this->setDB($a); $db = new Persistence_SQL($this->db->connection); $m_u = new Model($db, 'user'); $m_u->addField('contact_id'); $m_u->addField('name'); $j_contact = $m_u->join('contact'); $j_contact->addField('contact_phone'); $j_country = $j_contact->join('country'); $j_country->addField('country_name', ['actual' => 'name']); $m_u->load(10); $m_u->delete(); $m_u->loadBy('country_name', 'US'); $this->assertEquals(30, $m_u->id); $m_u['country_name'] = 'USA'; $m_u->save(); $m_u->tryLoad(40); $this->assertEquals(false, $m_u->loaded()); $this->assertSame($m_u->getElement('country_id')->join, $m_u->getElement('contact_phone')->join); $m_u->unload(); $m_u->save(['name' => 'new', 'contact_phone' => '+000', 'country_name' => 'LV']); $this->assertEquals(['user' => [20 => ['id' => 20, 'name' => 'Peter', 'contact_id' => 100], 30 => ['id' => 30, 'name' => 'XX', 'contact_id' => 200], 40 => ['id' => 40, 'name' => 'YYY', 'contact_id' => 300], 41 => ['id' => 41, 'name' => 'new', 'contact_id' => 301]], 'contact' => [200 => ['id' => 200, 'contact_phone' => '+999', 'country_id' => 2], 300 => ['id' => 300, 'contact_phone' => '+777', 'country_id' => 5], 301 => ['id' => 301, 'contact_phone' => '+000', 'country_id' => 4]], 'country' => [2 => ['id' => 2, 'name' => 'USA'], 3 => ['id' => 3, 'name' => 'India'], 4 => ['id' => 4, 'name' => 'LV']]], $this->getDB()); }
public function testReloading() { $a = ['math' => [['a' => 2, 'b' => 2]]]; $this->setDB($a); $db = new Persistence_SQL($this->db->connection); $m = new Model($db, 'math'); $m->addFields(['a', 'b']); $m->addExpression('sum', '[a] + [b]'); $m->load(1); $this->assertEquals(4, $m['sum']); $m->save(['a' => 3]); $this->assertEquals(5, $m['sum']); $this->assertEquals(9, $m->unload()->save(['a' => 4, 'b' => 5])->get('sum')); $this->setDB($a); $m = new Model($db, ['math', 'reload_after_save' => false]); $m->addFields(['a', 'b']); $m->addExpression('sum', '[a] + [b]'); $m->load(1); $this->assertEquals(4, $m['sum']); $m->save(['a' => 3]); $this->assertEquals(4, $m['sum']); $this->assertEquals(null, $m->unload()->save(['a' => 4, 'b' => 5])->get('sum')); }
public function testJoinUpdate() { $a = ['user' => [1 => ['id' => 1, 'name' => 'John', 'contact_id' => 1], 2 => ['id' => 2, 'name' => 'Peter', 'contact_id' => 1], 3 => ['id' => 3, 'name' => 'Joe', 'contact_id' => 2]], 'contact' => [1 => ['id' => 1, 'contact_phone' => '+123'], 2 => ['id' => 2, 'contact_phone' => '+321']]]; $db = new Persistence_Array($a); $m_u = new Model($db, 'user'); $m_u->addField('contact_id'); $m_u->addField('name'); $j = $m_u->join('contact'); $j->addField('contact_phone'); $m_u->load(1); $m_u['name'] = 'John 2'; $m_u['contact_phone'] = '+555'; $m_u->save(); $this->assertEquals(['user' => [1 => ['id' => 1, 'name' => 'John 2', 'contact_id' => 1], 2 => ['id' => 2, 'name' => 'Peter', 'contact_id' => 1], 3 => ['id' => 3, 'name' => 'Joe', 'contact_id' => 2]], 'contact' => [1 => ['id' => 1, 'contact_phone' => '+555'], 2 => ['id' => 2, 'contact_phone' => '+321']]], $a); $m_u->load(3); $m_u['name'] = 'XX'; $m_u['contact_phone'] = '+999'; $m_u->save(); $this->assertEquals(['user' => [1 => ['id' => 1, 'name' => 'John 2', 'contact_id' => 1], 2 => ['id' => 2, 'name' => 'Peter', 'contact_id' => 1], 3 => ['id' => 3, 'name' => 'XX', 'contact_id' => 2]], 'contact' => [1 => ['id' => 1, 'contact_phone' => '+555'], 2 => ['id' => 2, 'contact_phone' => '+999']]], $a); $m_u->tryLoad(4); $m_u['name'] = 'YYY'; $m_u['contact_phone'] = '+777'; $m_u->save(); $this->assertEquals(['user' => [1 => ['id' => 1, 'name' => 'John 2', 'contact_id' => 1], 2 => ['id' => 2, 'name' => 'Peter', 'contact_id' => 1], 3 => ['id' => 3, 'name' => 'XX', 'contact_id' => 2], 4 => ['id' => 4, 'name' => 'YYY', 'contact_id' => 3]], 'contact' => [1 => ['id' => 1, 'contact_phone' => '+555'], 2 => ['id' => 2, 'contact_phone' => '+999'], 3 => ['id' => 3, 'contact_phone' => '+777']]], $a); }
public function testTimestampSave() { $a = ['types' => [['date' => '']]]; $this->setDB($a); $db = new Persistence_SQL($this->db->connection); $m = new Model($db, ['table' => 'types']); $m->addField('ts', ['actual' => 'date', 'type' => 'date']); $m->loadAny(); $m['ts'] = new \DateTime('2012-02-30'); $m->save(); // stores valid date. $this->assertEquals(['types' => [1 => ['id' => 1, 'date' => '2012-03-01']]], $this->getDB()); }
/** * Model is not associated with any database - persistence should be set. * * @expectedException Exception */ public function testException6() { $m = new Model(); $m->save(); }
public function testEncryptedField() { $db = new Persistence_SQL($this->db->connection); $a = ['user' => ['_' => ['id' => 1, 'name' => 'John', 'secret' => 'Smith']]]; $this->setDB($a); $encrypt = function ($value, $field, $persistence) { if (!$persistence instanceof \atk4\data\Persistence_SQL) { return $value; } /* $algorithm = 'rijndael-128'; $key = md5($field->password, true); $iv_length = mcrypt_get_iv_size( $algorithm, MCRYPT_MODE_CBC ); $iv = mcrypt_create_iv( $iv_length, MCRYPT_RAND ); return mcrypt_encrypt( $algorithm, $key, $value, MCRYPT_MODE_CBC, $iv ); */ return base64_encode($value); }; $decrypt = function ($value, $field, $persistence) { if (!$persistence instanceof \atk4\data\Persistence_SQL) { return $value; } /* $algorithm = 'rijndael-128'; $key = md5($field->password, true); $iv_length = mcrypt_get_iv_size( $algorithm, MCRYPT_MODE_CBC ); $iv = mcrypt_create_iv( $iv_length, MCRYPT_RAND ); return mcrypt_encrypt( $algorithm, $key, $value, MCRYPT_MODE_CBC, $iv ); */ return base64_decode($value); }; $m = new Model($db, 'user'); $m->addField('name', ['mandatory' => true]); $m->addField('secret', ['typecast' => [$encrypt, $decrypt]]); $m->save(['name' => 'John', 'secret' => 'i am a woman']); $a = $this->getDB(); $this->assertNotNull($a['user'][1]['secret']); $this->assertNotEquals('i am a woman', $a['user'][1]['secret']); $m->unload()->load(1); $this->assertEquals('i am a woman', $m['secret']); }