예제 #1
0
 /**
  * Test date time serialization.
  */
 public function testSerializeDateTime()
 {
     $decoded = json_decode(json_encode(new DateTimeValue()), true);
     $this->assertInternalType('integer', $decoded);
     $this->assertNotEmpty($decoded);
     $this->assertEquals($this->reference->getTimestamp(), json_decode(json_encode(new DateTimeValue()), true));
 }
예제 #2
0
 /**
  * Test all events.
  */
 public function testAll()
 {
     for ($i = 1; $i <= 11; ++$i) {
         $this->current_timestamp->addSecond();
         DateTimeValue::setTestNow($this->current_timestamp);
         $this->account->events->add("Event {$i}");
     }
     $all_events = $this->account->events->all();
     $this->assertCount(11, $all_events);
     $this->assertEquals('Event 11', $all_events[0]['name']);
     $this->assertEquals('Event 1', $all_events[10]['name']);
 }
예제 #3
0
 /**
  * Test if subscription rebill triggers an event.
  */
 public function testSubscriptionRebillTriggersAnEvent()
 {
     $event_triggered = false;
     $this->dispatcher->listen(DispatcherInterface::ON_SUBSCRIPTION_REBILLED, function (GatewayInterface $gateway, SubscriptionInterface $subscription, RebillInterface $rebill) use(&$event_triggered) {
         $this->assertInstanceOf(ExampleOffsiteGateway::class, $gateway);
         $this->assertInstanceOf(Subscription::class, $subscription);
         $this->assertInstanceOf(RebillInterface::class, $rebill);
         $this->assertEquals($this->subscription->getReference(), $subscription->getReference());
         $this->assertEquals($this->subscription->getReference(), $rebill->getSubscriptionReference());
         $this->assertEquals($this->timestamp->addMonth()->format('Y-m-d'), $rebill->getNextBillingTimestamp()->format('Y-m-d'));
         $event_triggered = true;
     });
     $this->gateway->triggerSubscriptionRebill($this->subscription, $this->timestamp);
     $this->assertTrue($event_triggered);
 }
예제 #4
0
 /**
  * Test ARPU on day call.
  */
 public function testArpuOnDay()
 {
     $m_monthly_mrr = (new PlanM())->getMrrValue(new Monthly());
     $l_monthly_mrr = (new PlanL())->getMrrValue(new Monthly());
     $l_yearly_mrr = (new PlanL())->getMrrValue(new Yearly());
     $this->current_timestamp = new DateTimeValue('2016-01-12');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->addPaid(1, new PlanM(), new Monthly());
     $this->current_timestamp = new DateTimeValue('2016-01-13');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->addPaid(2, new PlanM(), new Monthly());
     $this->current_timestamp = new DateTimeValue('2016-01-14');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->addPaid(3, new PlanL(), new Monthly());
     $this->current_timestamp = new DateTimeValue('2016-01-15');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->addPaid(4, new PlanL(), new Monthly());
     $this->current_timestamp = new DateTimeValue('2016-01-16');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->cancel(1);
     $this->insight->accounts->cancel(2);
     $this->current_timestamp = new DateTimeValue('2016-01-18');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(4, new PlanL(), new Yearly());
     $this->assertEquals(0, $this->insight->accounts->countPaid(new DateValue('2016-01-11')));
     $this->assertEquals(0, $this->insight->arpu->getOnDay(new DateValue('2016-01-11')));
     $this->assertEquals(1, $this->insight->accounts->countPaid(new DateValue('2016-01-12')));
     $this->assertEquals($m_monthly_mrr, $this->insight->arpu->getOnDay(new DateValue('2016-01-12')));
     $this->assertEquals(2, $this->insight->accounts->countPaid(new DateValue('2016-01-13')));
     $this->assertEquals($m_monthly_mrr, $this->insight->arpu->getOnDay(new DateValue('2016-01-13')));
     $this->assertEquals(3, $this->insight->accounts->countPaid(new DateValue('2016-01-14')));
     $this->assertEquals(ceil(($m_monthly_mrr * 2 + $l_monthly_mrr) / 3), $this->insight->arpu->getOnDay(new DateValue('2016-01-14')));
     $this->assertEquals(4, $this->insight->accounts->countPaid(new DateValue('2016-01-15')));
     $this->assertEquals(ceil(($m_monthly_mrr * 2 + $l_monthly_mrr * 2) / 4), $this->insight->arpu->getOnDay(new DateValue('2016-01-15')));
     $this->assertEquals(4, $this->insight->accounts->countPaid(new DateValue('2016-01-16')));
     $this->assertEquals(ceil(($m_monthly_mrr * 2 + $l_monthly_mrr * 2) / 4), $this->insight->arpu->getOnDay(new DateValue('2016-01-16')));
     $this->assertEquals(2, $this->insight->accounts->countPaid(new DateValue('2016-01-17')));
     $this->assertEquals($l_monthly_mrr, $this->insight->arpu->getOnDay(new DateValue('2016-01-17')));
     $this->assertEquals(2, $this->insight->accounts->countPaid(new DateValue('2016-01-18')));
     $this->assertEquals(ceil(($l_monthly_mrr + $l_yearly_mrr) / 2), $this->insight->arpu->getOnDay(new DateValue('2016-01-18')));
     // A year in the future...
     $this->assertEquals(2, $this->insight->accounts->countPaid(new DateValue('2017-01-18')));
     $this->assertEquals(ceil(($l_monthly_mrr + $l_yearly_mrr) / 2), $this->insight->arpu->getOnDay(new DateValue('2017-01-18')));
 }
예제 #5
0
 /**
  * Test MRR on day call.
  */
 public function testMrrOnDay()
 {
     $this->current_timestamp = new DateTimeValue('2016-01-12 11:11:11');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->addTrial(1);
     $this->insight->accounts->addTrial(2);
     $this->insight->accounts->addTrial(3);
     $this->current_timestamp = new DateTimeValue('2016-01-15 12:12:12');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(1, new FreePlan(), new None());
     $this->insight->accounts->changePlan(3, new PlanM(), new Yearly());
     $this->current_timestamp = new DateTimeValue('2016-01-16 13:13:13');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(1, new PlanL(), new Monthly());
     $this->current_timestamp = new DateTimeValue('2016-01-17 14:14:14');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(3, new PlanL(), new Yearly());
     $this->current_timestamp = new DateTimeValue('2016-01-17 14:14:15');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(3, new PlanL(), new Monthly());
     $this->current_timestamp = new DateTimeValue('2016-01-17 14:14:16');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(3, new PlanM(), new Monthly());
     $this->current_timestamp = new DateTimeValue('2016-01-18 15:15:15');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->cancel(1);
     $m_monthly_mrr = (int) ceil((new PlanM())->getMrrValue(new Monthly()));
     $m_yearly_mrr = (int) ceil((new PlanM())->getMrrValue(new Yearly()));
     $l_monthly_mrr = (int) ceil((new PlanL())->getMrrValue(new Monthly()));
     $this->assertEquals(0, $this->insight->mrr->getOnDay(new DateValue('2016-01-12')));
     $this->assertEquals(0, $this->insight->mrr->getOnDay(new DateValue('2016-01-13')));
     $this->assertEquals(0, $this->insight->mrr->getOnDay(new DateValue('2016-01-14')));
     // Account #3, M yearly
     $this->assertSame($m_yearly_mrr, $this->insight->mrr->getOnDay(new DateValue('2016-01-15')));
     // Account #3, M yearly + Account #1, L monthly
     $this->assertEquals($m_yearly_mrr + $l_monthly_mrr, $this->insight->mrr->getOnDay(new DateValue('2016-01-16')));
     // Account #3, M monthly + Account #1, L monthly
     $this->assertEquals($m_monthly_mrr + $l_monthly_mrr, $this->insight->mrr->getOnDay(new DateValue('2016-01-17')));
     // Account #3, M monthly + Account #1, L monthly (canceled, but day started with this value)
     $this->assertEquals($m_monthly_mrr + $l_monthly_mrr, $this->insight->mrr->getOnDay(new DateValue('2016-01-18')));
     // Account #3, M monthly
     $this->assertEquals($m_monthly_mrr, $this->insight->mrr->getOnDay(new DateValue('2016-01-19')));
 }
 /**
  * Test account status timeline.
  */
 public function testAccountStatusTimeline()
 {
     $account_status_spans_table = $this->insight->getTableName('account_status_spans');
     $this->assertEquals(0, $this->connection->count($account_status_spans_table));
     $this->current_timestamp = new DateTimeValue('2016-01-12 11:11:11');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->addTrial(1);
     $this->current_timestamp = new DateTimeValue('2016-01-14 12:12:12');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(1, new FreePlan(), new None());
     $this->current_timestamp = new DateTimeValue('2016-01-18 13:13:13');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(1, new PlanM(), new Yearly());
     $this->current_timestamp = new DateTimeValue('2016-01-24 14:14:14');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->retire(1);
     $this->current_timestamp = new DateTimeValue('2016-01-28 15:15:15');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->cancel(1);
     $this->assertEquals(5, $this->connection->count($account_status_spans_table));
     $timeline = $this->insight->account(1)->status_timeline->get();
     $this->assertInternalType('array', $timeline);
     $this->assertCount(5, $timeline);
     $this->assertEquals(AccountsInterface::CANCELED, $timeline[0]['status']);
     $this->assertEquals('2016-01-28 15:15:15', $timeline[0]['started_at']->format('Y-m-d H:i:s'));
     $this->assertNull($timeline[0]['ended_at']);
     $this->assertEquals(AccountsInterface::RETIRED, $timeline[1]['status']);
     $this->assertEquals('2016-01-24 14:14:14', $timeline[1]['started_at']->format('Y-m-d H:i:s'));
     $this->assertEquals('2016-01-28 15:15:15', $timeline[1]['ended_at']->format('Y-m-d H:i:s'));
     $this->assertEquals(AccountsInterface::PAID, $timeline[2]['status']);
     $this->assertEquals('2016-01-18 13:13:13', $timeline[2]['started_at']->format('Y-m-d H:i:s'));
     $this->assertEquals('2016-01-24 14:14:14', $timeline[2]['ended_at']->format('Y-m-d H:i:s'));
     $this->assertEquals(AccountsInterface::FREE, $timeline[3]['status']);
     $this->assertEquals('2016-01-14 12:12:12', $timeline[3]['started_at']->format('Y-m-d H:i:s'));
     $this->assertEquals('2016-01-18 13:13:13', $timeline[3]['ended_at']->format('Y-m-d H:i:s'));
     $this->assertEquals(AccountsInterface::TRIAL, $timeline[4]['status']);
     $this->assertEquals('2016-01-12 11:11:11', $timeline[4]['started_at']->format('Y-m-d H:i:s'));
     $this->assertEquals('2016-01-14 12:12:12', $timeline[4]['ended_at']->format('Y-m-d H:i:s'));
 }
 /**
  * Test account MRR timeline.
  */
 public function testAccountMrrTimeline()
 {
     $account_mrr_spans_table = $this->insight->getTableName('account_mrr_spans');
     $this->assertEquals(0, $this->connection->count($account_mrr_spans_table));
     $this->current_timestamp = new DateTimeValue('2016-01-12 11:11:11');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->addTrial(1);
     $this->current_timestamp = new DateTimeValue('2016-01-14 12:12:12');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(1, new FreePlan(), new None());
     $this->current_timestamp = new DateTimeValue('2016-01-18 13:13:13');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(1, new PlanM(), new Yearly());
     $this->current_timestamp = new DateTimeValue('2016-01-24 14:14:14');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(1, new PlanL(), new Monthly());
     $this->current_timestamp = new DateTimeValue('2016-01-27 15:15:15');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->retire(1);
     $this->current_timestamp = new DateTimeValue('2016-02-02 16:16:16');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(1, new PlanM(), new Monthly());
     $this->current_timestamp = new DateTimeValue('2016-07-22 17:17:17');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->cancel(1);
     $this->assertEquals(3, $this->connection->count($account_mrr_spans_table));
     $timeline = $this->insight->account(1)->mrr_timeline->get();
     $this->assertInternalType('array', $timeline);
     $this->assertCount(3, $timeline);
     $this->assertSame(49.0, $timeline[0]['mrr_value']);
     $this->assertEquals('2016-02-02 16:16:16', $timeline[0]['started_at']->format('Y-m-d H:i:s'));
     $this->assertEquals('2016-07-22 17:17:17', $timeline[0]['ended_at']->format('Y-m-d H:i:s'));
     $this->assertSame(99.0, $timeline[1]['mrr_value']);
     $this->assertEquals('2016-01-24 14:14:14', $timeline[1]['started_at']->format('Y-m-d H:i:s'));
     $this->assertEquals('2016-01-27 15:15:15', $timeline[1]['ended_at']->format('Y-m-d H:i:s'));
     $this->assertSame(41.583, $timeline[2]['mrr_value']);
     $this->assertEquals('2016-01-18 13:13:13', $timeline[2]['started_at']->format('Y-m-d H:i:s'));
     $this->assertEquals('2016-01-24 14:14:14', $timeline[2]['ended_at']->format('Y-m-d H:i:s'));
 }
예제 #8
0
 /**
  * Test if created at timestamp is properly recorded on different events.
  */
 public function testCreationTimestampIsRecorded()
 {
     $account_updates_table = $this->insight->getTableName('account_updates');
     $this->current_timestamp = new DateTimeValue('2016-01-12 11:11:11');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->addTrial(1);
     $this->current_timestamp = new DateTimeValue('2016-01-28 12:12:12');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(1, new PlanM(), new Yearly());
     $this->current_timestamp = new DateTimeValue('2016-02-22 13:13:13');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->changePlan(1, new FreePlan(), new None());
     $this->current_timestamp = new DateTimeValue('2016-03-12 14:14:14');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->insight->accounts->retire(1);
     /** @var DateTimeValue $first_update_timestamp */
     $first_update_timestamp = $this->connection->executeFirstCell("SELECT `created_at` FROM `{$account_updates_table}` WHERE `id` = ?", 1);
     $this->assertInstanceOf(DateTimeValue::class, $first_update_timestamp);
     $this->assertEquals('2016-01-28 12:12:12', $first_update_timestamp->format('Y-m-d H:i:s'));
     /** @var DateTimeValue $second_update_timestamp */
     $second_update_timestamp = $this->connection->executeFirstCell("SELECT `created_at` FROM `{$account_updates_table}` WHERE `id` = ?", 2);
     $this->assertInstanceOf(DateTimeValue::class, $second_update_timestamp);
     $this->assertEquals('2016-02-22 13:13:13', $second_update_timestamp->format('Y-m-d H:i:s'));
     /* @var DateTimeValue $first_update_timestamp */
     $third_update_timestamp = $this->connection->executeFirstCell("SELECT `created_at` FROM `{$account_updates_table}` WHERE `id` = ?", 3);
     $this->assertInstanceOf(DateTimeValue::class, $third_update_timestamp);
     $this->assertEquals('2016-03-12 14:14:14', $third_update_timestamp->format('Y-m-d H:i:s'));
 }
예제 #9
0
 /**
  * Test accounts canceled today, without going back through history.
  */
 public function testCountCanceledToday()
 {
     $this->insight->accounts->addTrial(1, new DateTimeValue('2016-02-12'));
     $this->insight->accounts->addTrial(2, new DateTimeValue('2016-02-13'));
     $this->insight->accounts->addTrial(3, new DateTimeValue('2016-02-14'));
     $this->insight->accounts->cancel(1, AccountsInterface::USER_CANCELED, new DateTimeValue('2016-02-16'));
     $this->insight->accounts->cancel(3, AccountsInterface::USER_CANCELED, new DateTimeValue('2016-02-16'));
     $this->current_timestamp = new DateTimeValue('2016-02-16');
     DateTimeValue::setTestNow($this->current_timestamp);
     $this->assertEquals(2, $this->insight->accounts->countCanceled());
 }
예제 #10
0
 /**
  * Test if now can be overriden, for test purposes.
  */
 public function testTestNow()
 {
     DateTimeValue::setTestNow(new DateTimeValue('2013-10-02 11:18:32'));
     $this->assertEquals((new DateTimeValue())->format('Y-m-d H:i:s'), date('2013-10-02 11:18:32'));
 }
예제 #11
0
 /**
  * {@inheritdoc}
  */
 public function tearDown()
 {
     DateTimeValue::setTestNow(null);
     $this->current_timestamp = null;
     parent::tearDown();
 }
예제 #12
0
 /**
  * @param DateTimeValueInterface|null $now
  */
 public function setNow(DateTimeValueInterface $now = null)
 {
     $this->now = $now;
     DateTimeValue::setTestNow($this->now);
 }