Skip to content

Commit 9e80a45

Browse files
committed
Add upsertBatch() test
1 parent c8b7086 commit 9e80a45

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

tests/system/Database/Live/UpsertTest.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use CodeIgniter\Database\RawSql;
1616
use CodeIgniter\Test\CIUnitTestCase;
1717
use CodeIgniter\Test\DatabaseTestTrait;
18+
use Config\Database;
1819
use stdclass;
1920
use Tests\Support\Database\Seeds\CITestSeeder;
2021

@@ -640,4 +641,79 @@ public function testUpsertWithMultipleSet()
640641

641642
$this->seeInDatabase('user', ['email' => '[email protected]', 'name' => 'Jarvis', 'country' => $dt]);
642643
}
644+
645+
public function testUpsertBatchWithQuery()
646+
{
647+
$this->forge = Database::forge($this->DBGroup);
648+
649+
$this->forge->dropTable('user2', true);
650+
651+
$this->forge->addField([
652+
'id' => ['type' => 'INTEGER', 'constraint' => 3, 'auto_increment' => true],
653+
'name' => ['type' => 'VARCHAR', 'constraint' => 80],
654+
'email' => ['type' => 'VARCHAR', 'constraint' => 100],
655+
'country' => ['type' => 'VARCHAR', 'constraint' => 40],
656+
'created_at' => ['type' => 'DATETIME', 'null' => true],
657+
'updated_at' => ['type' => 'DATETIME', 'null' => true],
658+
'deleted_at' => ['type' => 'DATETIME', 'null' => true],
659+
'last_loggin' => ['type' => 'DATETIME', 'null' => true],
660+
])->addKey('id', true)->addUniqueKey('email')->addKey('country')->createTable('user2', true);
661+
662+
$data = [
663+
[
664+
'name' => 'Derek Jones user2',
665+
'email' => '[email protected]',
666+
'country' => 'France',
667+
],
668+
[
669+
'name' => 'Ahmadinejad user2',
670+
'email' => '[email protected]',
671+
'country' => 'Greece',
672+
],
673+
[
674+
'name' => 'Richard A Causey user2',
675+
'email' => '[email protected]',
676+
'country' => 'France',
677+
],
678+
[
679+
'name' => 'Chris Martin user2',
680+
'email' => '[email protected]',
681+
'country' => 'Greece',
682+
],
683+
[
684+
'name' => 'New User user2',
685+
'email' => '[email protected]',
686+
'country' => 'US',
687+
],
688+
[
689+
'name' => 'New User2 user2',
690+
'email' => '[email protected]',
691+
'country' => 'US',
692+
],
693+
];
694+
$this->db->table('user2')->insertBatch($data);
695+
696+
$rawSql = new RawSql('CURRENT_TIMESTAMP');
697+
698+
$updateFields = ['updated_at' => $rawSql];
699+
700+
$subQuery = $this->db->table('user2')->select('email, name, country');
701+
702+
$this->db->table('user')->updateFields($updateFields, true)->onConstraint('email')->upsertBatch($subQuery);
703+
704+
$this->seeInDatabase('user', ['name' => 'Derek Jones user2', 'email' => '[email protected]']);
705+
$this->seeInDatabase('user', ['name' => 'New User user2', 'email' => '[email protected]']);
706+
707+
$result = $this->db->table('user')->get()->getResultArray();
708+
709+
foreach ($result as $row) {
710+
if ($row['email'] === '[email protected]' || $row['email'] === '[email protected]') {
711+
$this->assertNull($row['updated_at']);
712+
} else {
713+
$this->assertNotNull($row['updated_at']);
714+
}
715+
}
716+
717+
$this->forge->dropTable('user2', true);
718+
}
643719
}

0 commit comments

Comments
 (0)