89 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Tests\Feature;
 | 
						|
 | 
						|
use PHPUnit\Framework\Attributes\DataProvider;
 | 
						|
use Tests\TestCase;
 | 
						|
 | 
						|
class TaskEstimationTest extends TestCase
 | 
						|
{
 | 
						|
    #[DataProvider('estimationDataProvider')]
 | 
						|
    public function testEstimationTasks(bool $calculateWithWorkingDays, string $startDate, int $minutesDuration, string $result): void
 | 
						|
    {
 | 
						|
        $response = $this->get($this->buildUrl('CZ', $startDate, $minutesDuration, $calculateWithWorkingDays, '08:00', '16:00'));
 | 
						|
        $response->assertStatus(200);
 | 
						|
        $response->assertJson([
 | 
						|
           'estimation_date' => $result,
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array<array<bool|string|int>>
 | 
						|
     */
 | 
						|
    public static function estimationDataProvider(): array
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            [false, '2024-01-03 08:00', 60, '2024-01-03 09:00:00'], // 1H
 | 
						|
            [false, '2024-01-03 08:00', 60 * 9 + 1, '2024-01-04 09:01:00'], // 1D, 1H, 1M
 | 
						|
            [false, '2024-01-01 08:00', 1, '2024-01-01 08:01:00'], // 1M
 | 
						|
            [false, '2024-01-01 08:00', 60 * 8, '2024-01-01 16:00:00'], // 1 working day
 | 
						|
            [true, '2024-01-05 08:00', 60 * 8 * 2, '2024-01-08 16:00:00'], // 1 working day, 6,7 is weekend
 | 
						|
            [true, '2024-01-05 08:00', 60 * 8, '2024-01-05 16:00:00'], // 1 working day without weekend*/
 | 
						|
            [false, '2024-01-05 15:59', 1, '2024-01-05 16:00:00'], // 1 minute before ending workday
 | 
						|
            [false, '2024-01-05 15:59', 2, '2024-01-06 08:01:00'], // 2 minutes before ending workday
 | 
						|
            [true, '2024-01-05 15:59', 2, '2024-01-08 08:01:00'], // 1 minute before ending workday, with weekend
 | 
						|
            [true, '2024-01-03 08:00', 60 * 9 + 1, '2024-01-04 09:01:00'], // 1D, 1H, 1M
 | 
						|
            [true, '2024-01-06 08:00', 60, '2024-01-08 09:00:00'] // 1 H, over weekend
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    #[DataProvider('invalidArgumentsDataProvider')]
 | 
						|
    public function testInvalidArguments(string $countryCode, string $startDate, int $minutesDuration, bool $calculateWithWorkingDays, string $startWork, string $endWork): void
 | 
						|
    {
 | 
						|
        $url = $this->buildUrl($countryCode, $startDate, $minutesDuration, $calculateWithWorkingDays, $startWork, $endWork);
 | 
						|
        $response = $this->get($url);
 | 
						|
        $response->assertStatus(400);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array<array<bool|string|int>>
 | 
						|
     */
 | 
						|
    public static function invalidArgumentsDataProvider(): array
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            ['ZZ', '2024-01-03 08:00', 30, false, '08:00', '16:00'], // bad country code
 | 
						|
            ['FOO', '2024-01-03 08:00', 30, false, '08:00', '16:00'], // bad country code
 | 
						|
            ['CZ', '2024-01-03 00:00', 30, false, '08:00', '16:00'], // missing seconds
 | 
						|
            ['CZ', '2024-01-03 08:00', -1000, false, '08:00', '16:00'], // negative duration
 | 
						|
            ['CZ', '2024-01-03 08:00', 30, false, '08:0?', '16:00'], // ? in start work time
 | 
						|
            ['CZ', '2024-01-03 08:00', 30, false, '08:00', '16:X0'], // X in end work time
 | 
						|
            ['CZ', '2024-01-03 08:00', 30, false, '08:00', 'FOO:00'], // FOO in end work time
 | 
						|
            ['CZ', '2024-01-03 08:00', 30, false, '09:00', '16:00'], // 08:00 is before workday
 | 
						|
            ['CZ', '2024-01-03 11:00', 30, false, '09:00', '10:00'], // 11 is after workday
 | 
						|
            ['CZ', '2024-01-03 09:00', 30, false, '09:00', '08:00'], // 09:00 > 08:00
 | 
						|
            ['CZ', '2024-01-03 08:00', 30, false, '09:00', '09:00'], // equal startDate and endDate
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    private function buildUrl(string $countryCode, string $startDate, int $minutesDuration, bool $calculateWithWorkingDays, string $startWork, string $endWork): string
 | 
						|
    {
 | 
						|
        $uri = [];
 | 
						|
        $uri[] = "api";
 | 
						|
        $uri[] = "v1";
 | 
						|
        $uri[] = "task-estimation";
 | 
						|
        $uri[] = $countryCode;
 | 
						|
        $uri[] = $startDate;
 | 
						|
        $uri[] = $minutesDuration;
 | 
						|
        $uri[] = (($calculateWithWorkingDays === false) ? '0' : '1');
 | 
						|
        $uri[] = $startWork;
 | 
						|
        $uri[] = $endWork;
 | 
						|
 | 
						|
        return implode('/', array_map(function ($part) {
 | 
						|
            return rawurlencode((string) $part);
 | 
						|
        }, $uri));
 | 
						|
    }
 | 
						|
}
 |