Merge pull request #17163 from jitendrapurohit/core-1731
[civicrm-core.git] / tests / phpunit / api / v4 / Action / SqlFunctionTest.php
index 9b33c594c3951f0c72bb9a8d734fb4c865fd9812..f948b22db48cb21093860941347f917ff5bcd141 100644 (file)
@@ -29,6 +29,14 @@ use Civi\Api4\Contribution;
  */
 class SqlFunctionTest extends UnitTestCase {
 
+  public function testGetFunctions() {
+    $functions = array_column(\CRM_Api4_Page_Api4Explorer::getSqlFunctions(), NULL, 'name');
+    $this->assertArrayHasKey('SUM', $functions);
+    $this->assertArrayNotHasKey('', $functions);
+    $this->assertArrayNotHasKey('SqlFunction', $functions);
+    $this->assertEquals(1, $functions['MAX']['params'][0]['expr']);
+  }
+
   public function testGroupAggregates() {
     $cid = Contact::create()->setCheckPermissions(FALSE)->addValue('first_name', 'bill')->execute()->first()['id'];
     Contribution::save()
@@ -59,4 +67,42 @@ class SqlFunctionTest extends UnitTestCase {
     $this->assertEquals(4, $agg['count']);
   }
 
+  public function testGroupHaving() {
+    $cid = Contact::create()->setCheckPermissions(FALSE)->addValue('first_name', 'donor')->execute()->first()['id'];
+    Contribution::save()
+      ->setCheckPermissions(FALSE)
+      ->setDefaults(['contact_id' => $cid, 'financial_type_id' => 1])
+      ->setRecords([
+        ['total_amount' => 100, 'receive_date' => '2020-02-02'],
+        ['total_amount' => 200, 'receive_date' => '2020-02-02'],
+        ['total_amount' => 300, 'receive_date' => '2020-03-03'],
+        ['total_amount' => 400, 'receive_date' => '2020-04-04'],
+      ])
+      ->execute();
+    $result = Contribution::get()
+      ->setCheckPermissions(FALSE)
+      ->addGroupBy('contact_id')
+      ->addGroupBy('receive_date')
+      ->addSelect('contact_id')
+      ->addSelect('receive_date')
+      ->addSelect('AVG(total_amount) AS average')
+      ->addSelect('SUM(total_amount)')
+      ->addSelect('MAX(total_amount)')
+      ->addSelect('MIN(total_amount)')
+      ->addSelect('COUNT(*) AS count')
+      ->addOrderBy('receive_date')
+      ->addHaving('contact_id', '=', $cid)
+      ->addHaving('receive_date', '<', '2020-04-01')
+      ->execute();
+    $this->assertCount(2, $result);
+    $this->assertEquals(150, $result[0]['average']);
+    $this->assertEquals(300, $result[1]['average']);
+    $this->assertEquals(300, $result[0]['SUM:total_amount']);
+    $this->assertEquals(300, $result[1]['SUM:total_amount']);
+    $this->assertEquals(200, $result[0]['MAX:total_amount']);
+    $this->assertEquals(100, $result[0]['MIN:total_amount']);
+    $this->assertEquals(2, $result[0]['count']);
+    $this->assertEquals(1, $result[1]['count']);
+  }
+
 }