statRepository = $this->configureRepository(Stat::class); $this->connection->method('createQueryBuilder')->willReturnCallback(fn () => new QueryBuilder($this->connection)); } public function testGetStatsSummaryForContacts(): void { $expectedQuery = 'SELECT l.id AS `lead_id`, COUNT(es.id) AS `sent_count`, SUM(IF(es.is_read IS NULL, 0, es.is_read)) AS `read_count`, SUM(IF(sq.hits is NULL, 0, 1)) AS `clicked_through_count` FROM '.MAUTIC_TABLE_PREFIX.'email_stats es RIGHT JOIN '.MAUTIC_TABLE_PREFIX.'leads l ON es.lead_id=l.id LEFT JOIN (SELECT COUNT(ph.id) AS hits, COUNT(DISTINCT(ph.redirect_id)) AS unique_hits, cut.channel_id, ph.lead_id FROM '.MAUTIC_TABLE_PREFIX.'channel_url_trackables cut INNER JOIN '.MAUTIC_TABLE_PREFIX."page_hits ph ON cut.redirect_id = ph.redirect_id AND cut.channel_id = ph.source_id WHERE (cut.channel = 'email' AND ph.source = 'email') AND (ph.lead_id in (:contacts)) GROUP BY cut.channel_id, ph.lead_id) sq ON es.email_id = sq.channel_id AND es.lead_id = sq.lead_id WHERE l.id in (:contacts) GROUP BY l.id"; $this->connection->expects($this->once()) ->method('executeQuery') ->with( $expectedQuery, ['contacts' => [6, 8]], ['contacts' => 101] ) ->willReturn($this->result); $this->result->method('fetchAllAssociative') ->willReturn([ [ 'lead_id' => '6', 'sent_count' => '12', 'read_count' => '6', 'clicked_through_count' => '3', ], [ 'lead_id' => '8', 'sent_count' => '13', 'read_count' => '7', 'clicked_through_count' => '6', ], ]); $this->assertSame( [ '6' => [ 'sent_count' => 12, 'read_count' => 6, 'clicked_count' => 3, 'open_rate' => 0.5, 'click_through_rate' => 0.25, 'click_through_open_rate' => 0.5, ], '8' => [ 'sent_count' => 13, 'read_count' => 7, 'clicked_count' => 6, 'open_rate' => 0.5385, 'click_through_rate' => 0.4615, 'click_through_open_rate' => 0.8571, ], ], $this->statRepository->getStatsSummaryForContacts([6, 8]) ); } public function testGetReadCount(): void { $expectedQuery = 'SELECT count(s.id) as count FROM test_email_stats s WHERE (s.email_id IN (1)) AND (is_read = :true) AND (s.date_read BETWEEN :dateFrom AND :dateTo)'; $this->connection->expects($this->once()) ->method('executeQuery') ->with( $expectedQuery, [ 'true' => true, 'dateFrom' => '2023-01-01 00:00:00', 'dateTo' => '2023-01-31 23:59:59', ] ) ->willReturn($this->result); $this->result->method('fetchAllAssociative') ->willReturn([ [ 'count' => 1, ], ]); $query = new ChartQuery($this->connection, new \DateTime('2023-01-01'), new \DateTime('2023-01-31')); $this->assertSame(1, $this->statRepository->getReadCount(1, null, $query)); } }