Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .github/actions/composer-install/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: Composer Install
description: "Install composer dependencies with cache"

runs:
using: composite
steps:
- name: Get Composer cache dir
id: composer-cache
shell: bash
run: echo "dir=$(composer config cache-dir)" >> $GITHUB_OUTPUT

- name: Cache Composer dependencies
uses: actions/cache@v3
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-

- name: Install dependencies
shell: bash
run: composer install --no-progress --prefer-dist --classmap-authoritative
49 changes: 26 additions & 23 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
@@ -1,45 +1,48 @@
name: Continuous integration
name: Tests

on:
push:

jobs:
check:
name: PHP ${{ matrix.php-version }}
lint:
name: Lint (PHP ${{ matrix.php-version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- php-version: '7.1'
- php-version: '7.2'
- php-version: '7.3'
- php-version: '7.4'
- php-version: '8.0'
- php-version: '8.1'
- php-version: '8.2'
- php-version: '8.3'
runs-on: ubuntu-latest
php-version: &php-versions ['7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3']

steps:
- uses: actions/checkout@v3

- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: none, curl, dom, json, mbstring, tokenizer, xml, xmlwriter, fileinfo
extensions: curl, dom, json, mbstring, tokenizer, xml, xmlwriter, fileinfo
coverage: none

- id: composer-cache
shell: bash
run: echo "dir=$(composer config cache-dir)" >> $GITHUB_OUTPUT
- uses: ./.github/actions/composer-install

- uses: actions/cache@v3
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
- run: ./vendor/bin/parallel-lint . --exclude ./vendor

- run: composer update --no-progress --no-cache --classmap-authoritative

- run: ./vendor/bin/parallel-lint . --exclude ./vendor
phpunit:
name: Unit test (PHP ${{ matrix.php-version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php-version: *php-versions

steps:
- uses: actions/checkout@v3

- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: curl, dom, json, mbstring, tokenizer, xml, xmlwriter, fileinfo
coverage: none

- uses: ./.github/actions/composer-install

- run: ./vendor/bin/phpunit
2 changes: 1 addition & 1 deletion src/Model/Fields/PointOfSale/Url.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ class Url extends Field
{
protected $name = __CLASS__;
protected $type = self::STRING;
protected $maxLength = 255;
protected $maxLength = 3072;
protected $pattern = 'http.*';
}
152 changes: 152 additions & 0 deletions tests/Model/Fields/FieldTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
<?php

namespace Model\Fields;

use InvalidArgumentException;
use PHPUnit\Framework\TestCase;
use ReflectionClass;
use Tpay\OpenApi\Model\Fields\Field;

class FieldTest extends TestCase
{
/**
* @dataProvider validValueProvider
*
* @param mixed $property
* @param mixed $propertyValue
* @param mixed $valueToSet
*/
public function testSetValueValid($property, $propertyValue, $valueToSet)
{
$field = new Field();

if ($property) {
$this->setFieldProperty($field, $property, $propertyValue);
}
$field->setValue($valueToSet);
$this->assertSame($valueToSet, $field->getValue());
}

/**
* @dataProvider invalidValueProvider
*
* @param mixed $property
* @param mixed $propertyValue
* @param mixed $valueToSet
* @param mixed $expectedMessage
*/
public function testSetValueInvalid($property, $propertyValue, $valueToSet, $expectedMessage)
{
$field = new Field();

if ($property) {
$this->setFieldProperty($field, $property, $propertyValue);
}
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage($expectedMessage);

$field->setValue($valueToSet);
}

public function validValueProvider()
{
return [
'No conditions' => [
'property' => null,
'propertyValue' => null,
'value' => 123,
],
'Max length' => [
'property' => 'maxLength',
'propertyValue' => 10,
'value' => 'test123',
],
'Min length' => [
'property' => 'minLength',
'propertyValue' => 3,
'value' => 'test123',
],
'Min value' => [
'property' => 'minimum',
'propertyValue' => 5,
'value' => 6,
],
'Max value' => [
'property' => 'maximum',
'propertyValue' => 12,
'value' => 10,
],
'Enum value' => [
'property' => 'enum',
'propertyValue' => ['one', 'two'],
'value' => 'one',
],
'Type' => [
'property' => 'type',
'propertyValue' => 'integer',
'value' => 10,
],
'Ipv4' => [
'property' => 'pattern',
'propertyValue' => '^([0-9]{1,3}\.){3}[0-9]{1,3}$',
'value' => '127.0.0.1',
],
];
}

public function invalidValueProvider()
{
return [
'Over max length' => [
'property' => 'maxLength',
'propertyValue' => 10,
'value' => 'test123test123',
'expectedMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Field is too long. Max allowed 10',
],
'Under min length' => [
'property' => 'minLength',
'propertyValue' => 3,
'value' => 'te',
'expectedMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Field is too short. Min required 3',
],
'Under minimum value' => [
'property' => 'minimum',
'propertyValue' => 5,
'value' => 3,
'expectedMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Field is too low. Min required 5',
],
'Over max value' => [
'property' => 'maximum',
'propertyValue' => 5,
'value' => 10,
'expectedMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Field exceeds the limit. Max allowed 5',
],
'Wrong enum value' => [
'property' => 'enum',
'propertyValue' => ['one', 'two'],
'value' => 'three',
'expectedMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Field is invalid. Should be one of Array',
],
'Wrong type' => [
'property' => 'type',
'propertyValue' => 'integer',
'value' => '',
'expectedMessage' => 'Value type of field Tpay\OpenApi\Model\Fields\Field is invalid. Should be integer type',
],
'Ipv6' => [
'property' => 'pattern',
'propertyValue' => '^([0-9]{1,3}\.){3}[0-9]{1,3}$',
'value' => '::1',
'expectedMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Field is invalid. Should match ^([0-9]{1,3}\.){3}[0-9]{1,3}$ pattern',
],
];
}

protected function setFieldProperty($object, $property, $value)
{
$ref = new ReflectionClass($object);
$prop = $ref->getProperty($property);
$prop->setAccessible(true);
$prop->setValue($object, $value);
}
}