faker = \Faker\Factory::create(); Model::reguard(); $this->makeTestData(); $this->withoutMiddleware( ThrottleRequests::class ); } public function testCustomDateRanges() { $data = [ 'name' => 'A test statement scheduler', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::CUSTOM_RANGE, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [], 'start_date' => now()->format('Y-m-d'), 'end_date' => now()->addDays(4)->format('Y-m-d') ], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(200); } public function testCustomDateRangesFails() { $data = [ 'name' => 'A test statement scheduler', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::CUSTOM_RANGE, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [], 'start_date' => now()->format('Y-m-d'), 'end_date' => now()->subDays(4)->format('Y-m-d') ], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(422); $data = [ 'name' => 'A test statement scheduler', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::CUSTOM_RANGE, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [], 'start_date' => now()->format('Y-m-d'), 'end_date' => null ], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(422); $data = [ 'name' => 'A test statement scheduler', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::CUSTOM_RANGE, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [], 'start_date' => null, 'end_date' => now()->format('Y-m-d') ], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(422); $data = [ 'name' => 'A test statement scheduler', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::CUSTOM_RANGE, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [], 'start_date' => '', 'end_date' => '' ], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(422); } public function testClientCountResolution() { $c = Client::factory()->create([ 'company_id' => $this->company->id, 'user_id' => $this->user->id, 'number' => rand(1000, 100000), 'name' => 'A fancy client' ]); $c2 = Client::factory()->create([ 'company_id' => $this->company->id, 'user_id' => $this->user->id, 'number' => rand(1000, 100000), 'name' => 'A fancy client' ]); $data = [ 'name' => 'A test statement scheduler', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::LAST_MONTH, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [ $c2->hashed_id, $c->hashed_id ], ], ]; $response = false; try { $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); } catch (ValidationException $e) { $message = json_decode($e->validator->getMessageBag(), 1); nlog($message); } $response->assertStatus(200); $data = $response->json(); $scheduler = Scheduler::find($this->decodePrimaryKey($data['data']['id'])); $this->assertInstanceOf(Scheduler::class, $scheduler); $this->assertCount(2, $scheduler->parameters['clients']); $q = Client::query() ->where('company_id', $scheduler->company_id) ->whereIn('id', $this->transformKeys($scheduler->parameters['clients'])) ->cursor(); $this->assertCount(2, $q); } public function testClientsValidationInScheduledTask() { $c = Client::factory()->create([ 'company_id' => $this->company->id, 'user_id' => $this->user->id, 'number' => rand(1000, 100000), 'name' => 'A fancy client' ]); $c2 = Client::factory()->create([ 'company_id' => $this->company->id, 'user_id' => $this->user->id, 'number' => rand(1000, 100000), 'name' => 'A fancy client' ]); $data = [ 'name' => 'A test statement scheduler', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::LAST_MONTH, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [ $c2->hashed_id, $c->hashed_id ], ], ]; $response = false; try { $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); } catch (ValidationException $e) { $message = json_decode($e->validator->getMessageBag(), 1); nlog($message); } $response->assertStatus(200); $data = [ 'name' => 'A single Client', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->addDay()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::LAST_MONTH, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [ $c2->hashed_id, ], ], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(200); $data = [ 'name' => 'An invalid Client', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::LAST_MONTH, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [ 'xx33434', ], ], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(422); } public function testCalculateNextRun() { $scheduler = SchedulerFactory::create($this->company->id, $this->user->id); $data = [ 'name' => 'A test statement scheduler', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::LAST_MONTH, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [], ], ]; $scheduler->fill($data); $scheduler->save(); $service_object = new SchedulerService($scheduler); $reflectionMethod = new \ReflectionMethod(SchedulerService::class, 'calculateNextRun'); $reflectionMethod->setAccessible(true); $method = $reflectionMethod->invoke(new SchedulerService($scheduler)); $scheduler->fresh(); $offset = $this->company->timezone_offset(); $this->assertEquals(now()->startOfDay()->addMonthNoOverflow()->addSeconds($offset)->format('Y-m-d'), $scheduler->next_run->format('Y-m-d')); } public function testCalculateStartAndEndDates() { $this->travelTo(Carbon::parse('2023-01-01')); $scheduler = SchedulerFactory::create($this->company->id, $this->user->id); $data = [ 'name' => 'A test statement scheduler', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => "2023-01-01", 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::LAST_MONTH, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [], ], ]; $scheduler->fill($data); $scheduler->save(); $service_object = new SchedulerService($scheduler); $reflectionMethod = new \ReflectionMethod(SchedulerService::class, 'calculateStartAndEndDates'); $reflectionMethod->setAccessible(true); $method = $reflectionMethod->invoke(new SchedulerService($scheduler)); $this->assertIsArray($method); $this->assertEquals(EmailStatement::LAST_MONTH, $scheduler->parameters['date_range']); $this->assertEqualsCanonicalizing(['2022-12-01','2022-12-31'], $method); } public function testCalculateStatementProperties() { $scheduler = SchedulerFactory::create($this->company->id, $this->user->id); $data = [ 'name' => 'A test statement scheduler', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::LAST_MONTH, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [], ], ]; $scheduler->fill($data); $scheduler->save(); $service_object = new SchedulerService($scheduler); // $reflection = new \ReflectionClass(get_class($service_object)); // $method = $reflection->getMethod('calculateStatementProperties'); // $method->setAccessible(true); // $method->invokeArgs($service_object, []); $reflectionMethod = new \ReflectionMethod(SchedulerService::class, 'calculateStatementProperties'); $reflectionMethod->setAccessible(true); $method = $reflectionMethod->invoke(new SchedulerService($scheduler)); // 'baz' $this->assertIsArray($method); $this->assertEquals('paid', $method['status']); } public function testGetThisMonthRange() { $this->travelTo(Carbon::parse('2023-01-14')); $this->assertEqualsCanonicalizing(['2023-01-01','2023-01-31'], $this->getDateRange(EmailStatement::THIS_MONTH)); $this->assertEqualsCanonicalizing(['2023-01-01','2023-03-31'], $this->getDateRange(EmailStatement::THIS_QUARTER)); $this->assertEqualsCanonicalizing(['2023-01-01','2023-12-31'], $this->getDateRange(EmailStatement::THIS_YEAR)); $this->assertEqualsCanonicalizing(['2022-12-01','2022-12-31'], $this->getDateRange(EmailStatement::LAST_MONTH)); $this->assertEqualsCanonicalizing(['2022-10-01','2022-12-31'], $this->getDateRange(EmailStatement::LAST_QUARTER)); $this->assertEqualsCanonicalizing(['2022-01-01','2022-12-31'], $this->getDateRange(EmailStatement::LAST_YEAR)); $this->travelBack(); } private function getDateRange($range) { return match ($range) { EmailStatement::LAST7 => [now()->startOfDay()->subDays(7)->format('Y-m-d'), now()->startOfDay()->format('Y-m-d')], EmailStatement::LAST30 => [now()->startOfDay()->subDays(30)->format('Y-m-d'), now()->startOfDay()->format('Y-m-d')], EmailStatement::LAST365 => [now()->startOfDay()->subDays(365)->format('Y-m-d'), now()->startOfDay()->format('Y-m-d')], EmailStatement::THIS_MONTH => [now()->startOfDay()->firstOfMonth()->format('Y-m-d'), now()->startOfDay()->lastOfMonth()->format('Y-m-d')], EmailStatement::LAST_MONTH => [now()->startOfDay()->subMonthNoOverflow()->firstOfMonth()->format('Y-m-d'), now()->startOfDay()->subMonthNoOverflow()->lastOfMonth()->format('Y-m-d')], EmailStatement::THIS_QUARTER => [now()->startOfDay()->firstOfQuarter()->format('Y-m-d'), now()->startOfDay()->lastOfQuarter()->format('Y-m-d')], EmailStatement::LAST_QUARTER => [now()->startOfDay()->subQuarterNoOverflow()->firstOfQuarter()->format('Y-m-d'), now()->startOfDay()->subQuarterNoOverflow()->lastOfQuarter()->format('Y-m-d')], EmailStatement::THIS_YEAR => [now()->startOfDay()->firstOfYear()->format('Y-m-d'), now()->startOfDay()->lastOfYear()->format('Y-m-d')], EmailStatement::LAST_YEAR => [now()->startOfDay()->subYearNoOverflow()->firstOfYear()->format('Y-m-d'), now()->startOfDay()->subYearNoOverflow()->lastOfYear()->format('Y-m-d')], EmailStatement::CUSTOM_RANGE => [$this->scheduler->parameters['start_date'], $this->scheduler->parameters['end_date']], default => [now()->startOfDay()->firstOfMonth()->format('Y-m-d'), now()->startOfDay()->lastOfMonth()->format('Y-m-d')], }; } public function testClientStatementGeneration() { $data = [ 'name' => 'A test statement scheduler', 'frequency_id' => RecurringInvoice::FREQUENCY_MONTHLY, 'next_run' => now()->format('Y-m-d'), 'template' => 'client_statement', 'parameters' => [ 'date_range' => EmailStatement::LAST_MONTH, 'show_payments_table' => true, 'show_aging_table' => true, 'status' => 'paid', 'clients' => [], ], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(200); } public function testDeleteSchedule() { $data = [ 'ids' => [$this->scheduler->hashed_id], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers/bulk?action=delete', $data) ->assertStatus(200); $data = [ 'ids' => [$this->scheduler->hashed_id], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers/bulk?action=restore', $data) ->assertStatus(200); } public function testRestoreSchedule() { $data = [ 'ids' => [$this->scheduler->hashed_id], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers/bulk?action=archive', $data) ->assertStatus(200); $data = [ 'ids' => [$this->scheduler->hashed_id], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers/bulk?action=restore', $data) ->assertStatus(200); } public function testArchiveSchedule() { $data = [ 'ids' => [$this->scheduler->hashed_id], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers/bulk?action=archive', $data) ->assertStatus(200); } public function testSchedulerPost() { $data = [ 'name' => 'A different Name', 'frequency_id' => 5, 'next_run' => now()->addDays(2)->format('Y-m-d'), 'template' =>'client_statement', 'parameters' => [], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(200); } public function testSchedulerPut() { $data = [ 'name' => 'A different Name', 'frequency_id' => 5, 'next_run' => now()->addDays(2)->format('Y-m-d'), 'template' =>'client_statement', 'parameters' => [], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->putJson('/api/v1/task_schedulers/'.$this->scheduler->hashed_id, $data); $response->assertStatus(200); } public function testSchedulerGet() { $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->get('/api/v1/task_schedulers'); $response->assertStatus(200); } public function testSchedulerCreate() { $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->get('/api/v1/task_schedulers/create'); $response->assertStatus(200); } // public function testSchedulerPut() // { // $data = [ // 'description' => $this->faker->firstName(), // ]; // $response = $this->withHeaders([ // 'X-API-SECRET' => config('ninja.api_secret'), // 'X-API-TOKEN' => $this->token, // ])->put('/api/v1/task_schedulers/'.$this->encodePrimaryKey($this->task->id), $data); // $response->assertStatus(200); // } // public function testSchedulerCantBeCreatedWithWrongData() // { // $data = [ // 'repeat_every' => Scheduler::DAILY, // 'job' => Scheduler::CREATE_CLIENT_REPORT, // 'date_key' => '123', // 'report_keys' => ['test'], // 'date_range' => 'all', // // 'start_from' => '2022-01-01' // ]; // $response = false; // $response = $this->withHeaders([ // 'X-API-SECRET' => config('ninja.api_secret'), // 'X-API-TOKEN' => $this->token, // ])->post('/api/v1/task_scheduler/', $data); // $response->assertSessionHasErrors(); // } // public function testSchedulerCanBeUpdated() // { // $response = $this->createScheduler(); // $arr = $response->json(); // $id = $arr['data']['id']; // $scheduler = Scheduler::find($this->decodePrimaryKey($id)); // $updateData = [ // 'start_from' => 1655934741, // ]; // $response = $this->withHeaders([ // 'X-API-SECRET' => config('ninja.api_secret'), // 'X-API-TOKEN' => $this->token, // ])->put('/api/v1/task_scheduler/'.$this->encodePrimaryKey($scheduler->id), $updateData); // $responseData = $response->json(); // $this->assertEquals($updateData['start_from'], $responseData['data']['start_from']); // } // public function testSchedulerCanBeSeen() // { // $response = $this->createScheduler(); // $arr = $response->json(); // $id = $arr['data']['id']; // $scheduler = Scheduler::find($this->decodePrimaryKey($id)); // $response = $this->withHeaders([ // 'X-API-SECRET' => config('ninja.api_secret'), // 'X-API-TOKEN' => $this->token, // ])->get('/api/v1/task_scheduler/'.$this->encodePrimaryKey($scheduler->id)); // $arr = $response->json(); // $this->assertEquals('create_client_report', $arr['data']['action_name']); // } // public function testSchedulerJobCanBeUpdated() // { // $response = $this->createScheduler(); // $arr = $response->json(); // $id = $arr['data']['id']; // $scheduler = Scheduler::find($this->decodePrimaryKey($id)); // $this->assertSame('create_client_report', $scheduler->action_name); // $updateData = [ // 'job' => Scheduler::CREATE_CREDIT_REPORT, // 'date_range' => 'all', // 'report_keys' => ['test1'], // ]; // $response = $this->withHeaders([ // 'X-API-SECRET' => config('ninja.api_secret'), // 'X-API-TOKEN' => $this->token, // ])->put('/api/v1/task_scheduler/'.$this->encodePrimaryKey($scheduler->id), $updateData); // $updatedSchedulerJob = Scheduler::first()->action_name; // $arr = $response->json(); // $this->assertSame('create_credit_report', $arr['data']['action_name']); // } // public function createScheduler() // { // $data = [ // 'repeat_every' => Scheduler::DAILY, // 'job' => Scheduler::CREATE_CLIENT_REPORT, // 'date_key' => '123', // 'report_keys' => ['test'], // 'date_range' => 'all', // 'start_from' => '2022-01-01', // ]; // return $response = $this->withHeaders([ // 'X-API-SECRET' => config('ninja.api_secret'), // 'X-API-TOKEN' => $this->token, // ])->post('/api/v1/task_scheduler/', $data); // } }