From 2dec8f7be439b54ecbab84a9e166265a8c52ddc9 Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Wed, 26 Nov 2025 11:12:48 +0100 Subject: [PATCH 1/3] REST API Items --- .gitbook.yaml | 5 - README.md | 75 ++++++++++++ src/Dto/Items/CreateEditItemDTO.php | 101 +++++++++++++++ src/Dto/Items/ItemDTO.php | 115 ++++++++++++++++++ src/Enums/Items/OrderByEnum.php | 40 ++++++ src/Requests/Items/CreateItemRequest.php | 48 ++++++++ src/Requests/Items/DeleteAnItemRequest.php | 31 +++++ src/Requests/Items/EditAnItemRequest.php | 49 ++++++++ .../Items/FetchAListOfItemsRequest.php | 53 ++++++++ src/Requests/Items/FetchAnItemRequest.php | 32 +++++ src/Requests/Items/SearchItemsRequest.php | 72 +++++++++++ tests/Fixtures/Saloon/Items/create-item.json | 2 + .../Fixtures/Saloon/Items/delete-an-item.json | 2 + tests/Fixtures/Saloon/Items/edit-an-item.json | 2 + .../Saloon/Items/fetch-a-list-of-items.json | 2 + .../Fixtures/Saloon/Items/fetch-an-item.json | 2 + tests/Fixtures/Saloon/Items/search-items.json | 2 + .../Requests/Items/CreateItemRequestTest.php | 26 ++++ .../Items/DeleteAnItemRequestTest.php | 19 +++ .../Requests/Items/EditAnItemRequestTest.php | 27 ++++ .../Items/FetchAListOfItemsRequestTest.php | 19 +++ .../Requests/Items/FetchAnItemRequestTest.php | 19 +++ .../Requests/Items/SearchItemsRequestTest.php | 22 ++++ 23 files changed, 760 insertions(+), 5 deletions(-) delete mode 100644 .gitbook.yaml create mode 100644 src/Dto/Items/CreateEditItemDTO.php create mode 100644 src/Dto/Items/ItemDTO.php create mode 100644 src/Enums/Items/OrderByEnum.php create mode 100644 src/Requests/Items/CreateItemRequest.php create mode 100644 src/Requests/Items/DeleteAnItemRequest.php create mode 100644 src/Requests/Items/EditAnItemRequest.php create mode 100644 src/Requests/Items/FetchAListOfItemsRequest.php create mode 100644 src/Requests/Items/FetchAnItemRequest.php create mode 100644 src/Requests/Items/SearchItemsRequest.php create mode 100644 tests/Fixtures/Saloon/Items/create-item.json create mode 100644 tests/Fixtures/Saloon/Items/delete-an-item.json create mode 100644 tests/Fixtures/Saloon/Items/edit-an-item.json create mode 100644 tests/Fixtures/Saloon/Items/fetch-a-list-of-items.json create mode 100644 tests/Fixtures/Saloon/Items/fetch-an-item.json create mode 100644 tests/Fixtures/Saloon/Items/search-items.json create mode 100644 tests/Requests/Items/CreateItemRequestTest.php create mode 100644 tests/Requests/Items/DeleteAnItemRequestTest.php create mode 100644 tests/Requests/Items/EditAnItemRequestTest.php create mode 100644 tests/Requests/Items/FetchAListOfItemsRequestTest.php create mode 100644 tests/Requests/Items/FetchAnItemRequestTest.php create mode 100644 tests/Requests/Items/SearchItemsRequestTest.php diff --git a/.gitbook.yaml b/.gitbook.yaml deleted file mode 100644 index 7353199..0000000 --- a/.gitbook.yaml +++ /dev/null @@ -1,5 +0,0 @@ -root: ./docs/ - -structure: - readme: README.md - summary: SUMMARY.md \ No newline at end of file diff --git a/README.md b/README.md index 0b61efb..d1a1886 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ This package was developed to give you a quick start to the Bexio API. - [Files](#files) - [Iban Payments](#iban-payments) - [Invoices](#invoices) + - [Items](#items) - [Languages](#languages) - [Manual Entries](#manual-entries) - [Notes](#notes) @@ -682,6 +683,7 @@ We provide enums for the following values: | ContactSectors: OrderByEnum | ID(), ID_ASC(), ID_DESC(), NAME(), NAME_ASC(), NAME_DESC() | | IbanPayments: AllowanceTypeEnum | FEE_PAID_BY_SENDER(), FEE_PAID_BY_RECIPIENT(), FEE_SPLIT(), NO_FEE() | | IbanPayments: StatusEnum | OPEN(), TRANSFERRED(), DOWNLOADED(), ERROR(), CANCELLED() | +| Items: OrderByEnum | ID(), ID_ASC(), ID_DESC(), INTERN_NAME(), INTERN_NAME_ASC(), INTERN_NAME_DESC() | | ManualEntries: TypeEnum | MANUAL_SINGLE_ENTRY(), MANUAL_GROUP_ENTRY(), MANUAL_COMPOUND_ENTRY() | | QrPayments: AllowanceTypeEnum | FEE_PAID_BY_SENDER(), FEE_PAID_BY_RECIPIENT(), FEE_SPLIT(), NO_FEE() | | QrPayments: StatusEnum | OPEN(), TRANSFERRED(), DOWNLOADED(), ERROR(), CANCELLED() | @@ -725,6 +727,8 @@ We provide DTOs for the following: | InvoiceDTO | | InvoicePositionDTO | | InvoiceTaxDTO | +| ItemDTO | +| CreateEditItemDTO | | PdfDTO | | LanguageDTO | | AddFileDTO | @@ -2003,6 +2007,77 @@ $title = $connector->send(new DeleteATitleRequest( )); ``` +### Items +```php +/** + * Fetch A List Of Items + */ +$items = $connector->send(new FetchAListOfItemsRequest())->dto(); +``` + +```php +/** + * Fetch An Item + */ +$item = $connector->send(new FetchAnItemRequest( + article_id: 1 +))->dto(); +``` + +```php +/** + * Search Items + */ +$items = $connector->send(new SearchItemsRequest( + searchField: 'intern_name', + searchTerm: 'Something' +))->dto(); +``` + +```php +/** + * Create Item + */ +$item = $connector->send(new CreateItemRequest( + data: new CreateEditItemDTO( + article_type_id: 1, + intern_code: 'ITEM-001', + intern_name: 'Test Item', + intern_description: 'Item Description', + sale_price: '20.00', + purchase_price: '10.00', + currency_id: 1, + unit_id: 1, + ) +))->dto(); +``` + +```php +/** + * Edit Item + */ +$item = $connector->send(new EditAnItemRequest( + article_id: 1, + data: new CreateEditItemDTO( + article_type_id: 1, + intern_code: 'ITEM-001', + intern_name: 'Updated Item Name', + intern_description: 'Updated Description', + sale_price: '25.00', + purchase_price: '15.00', + ) +))->dto(); +``` + +```php +/** + * Delete Item + */ +$response = $connector->send(new DeleteAnItemRequest( + article_id: 1 +)); +``` + ### VAT Periods ```php /** diff --git a/src/Dto/Items/CreateEditItemDTO.php b/src/Dto/Items/CreateEditItemDTO.php new file mode 100644 index 0000000..30d791c --- /dev/null +++ b/src/Dto/Items/CreateEditItemDTO.php @@ -0,0 +1,101 @@ +failed()) { + throw new \Exception('Failed to create DTO from Response'); + } + + $data = $response->json(); + + return self::fromArray($data); + } + + public static function fromArray(array $data): self + { + if (! $data) { + throw new Exception('Unable to create DTO. Data missing from response.'); + } + + return new self( + user_id: Arr::get($data, 'user_id'), + article_type_id: Arr::get($data, 'article_type_id'), + contact_id: Arr::get($data, 'contact_id'), + deliverer_code: Arr::get($data, 'deliverer_code'), + deliverer_name: Arr::get($data, 'deliverer_name'), + deliverer_description: Arr::get($data, 'deliverer_description'), + intern_code: Arr::get($data, 'intern_code'), + intern_name: Arr::get($data, 'intern_name'), + intern_description: Arr::get($data, 'intern_description'), + purchase_price: Arr::get($data, 'purchase_price'), + sale_price: Arr::get($data, 'sale_price'), + purchase_total: Arr::get($data, 'purchase_total'), + sale_total: Arr::get($data, 'sale_total'), + currency_id: Arr::get($data, 'currency_id'), + tax_income_id: Arr::get($data, 'tax_income_id'), + tax_id: Arr::get($data, 'tax_id'), + tax_expense_id: Arr::get($data, 'tax_expense_id'), + unit_id: Arr::get($data, 'unit_id'), + is_stock: Arr::get($data, 'is_stock', false), + stock_id: Arr::get($data, 'stock_id'), + stock_place_id: Arr::get($data, 'stock_place_id'), + stock_nr: Arr::get($data, 'stock_nr', 0), + stock_min_nr: Arr::get($data, 'stock_min_nr', 0), + width: Arr::get($data, 'width'), + height: Arr::get($data, 'height'), + weight: Arr::get($data, 'weight'), + volume: Arr::get($data, 'volume'), + html_text: Arr::get($data, 'html_text'), + remarks: Arr::get($data, 'remarks'), + delivery_price: Arr::get($data, 'delivery_price'), + article_group_id: Arr::get($data, 'article_group_id'), + account_id: Arr::get($data, 'account_id'), + expense_account_id: Arr::get($data, 'expense_account_id'), + ); + } +} diff --git a/src/Dto/Items/ItemDTO.php b/src/Dto/Items/ItemDTO.php new file mode 100644 index 0000000..e0bd031 --- /dev/null +++ b/src/Dto/Items/ItemDTO.php @@ -0,0 +1,115 @@ +failed()) { + throw new \Exception('Failed to create DTO from Response'); + } + + $data = $response->json(); + + return self::fromArray($data); + } + + public static function fromArray(array $data): self + { + if (! $data) { + throw new Exception('Unable to create DTO. Data missing from response.'); + } + + return new self( + id: Arr::get($data, 'id'), + user_id: Arr::get($data, 'user_id'), + article_type_id: Arr::get($data, 'article_type_id'), + contact_id: Arr::get($data, 'contact_id'), + master_id: Arr::get($data, 'master_id'), + deliverer_code: Arr::get($data, 'deliverer_code'), + deliverer_name: Arr::get($data, 'deliverer_name'), + deliverer_description: Arr::get($data, 'deliverer_description'), + intern_code: Arr::get($data, 'intern_code'), + intern_name: Arr::get($data, 'intern_name'), + intern_description: Arr::get($data, 'intern_description'), + purchase_price: Arr::get($data, 'purchase_price'), + sale_price: Arr::get($data, 'sale_price'), + purchase_total: Arr::get($data, 'purchase_total'), + sale_total: Arr::get($data, 'sale_total'), + currency_id: Arr::get($data, 'currency_id'), + tax_income_id: Arr::get($data, 'tax_income_id'), + tax_id: Arr::get($data, 'tax_id'), + tax_expense_id: Arr::get($data, 'tax_expense_id'), + unit_id: Arr::get($data, 'unit_id'), + is_stock: Arr::get($data, 'is_stock', false), + stock_id: Arr::get($data, 'stock_id'), + stock_place_id: Arr::get($data, 'stock_place_id'), + stock_nr: Arr::get($data, 'stock_nr', 0), + stock_min_nr: Arr::get($data, 'stock_min_nr', 0), + stock_reserved_nr: Arr::get($data, 'stock_reserved_nr', 0), + stock_available_nr: Arr::get($data, 'stock_available_nr', 0), + stock_picked_nr: Arr::get($data, 'stock_picked_nr', 0), + stock_disposed_nr: Arr::get($data, 'stock_disposed_nr', 0), + stock_ordered_nr: Arr::get($data, 'stock_ordered_nr', 0), + width: Arr::get($data, 'width'), + height: Arr::get($data, 'height'), + weight: Arr::get($data, 'weight'), + volume: Arr::get($data, 'volume'), + html_text: Arr::get($data, 'html_text'), + remarks: Arr::get($data, 'remarks'), + delivery_price: Arr::get($data, 'delivery_price'), + article_group_id: Arr::get($data, 'article_group_id'), + account_id: Arr::get($data, 'account_id'), + expense_account_id: Arr::get($data, 'expense_account_id'), + ); + } +} diff --git a/src/Enums/Items/OrderByEnum.php b/src/Enums/Items/OrderByEnum.php new file mode 100644 index 0000000..5eb3de1 --- /dev/null +++ b/src/Enums/Items/OrderByEnum.php @@ -0,0 +1,40 @@ + 'id', + 'ID_ASC' => 'id_asc', + 'ID_DESC' => 'id_desc', + 'INTERN_NAME' => 'intern_name', + 'INTERN_NAME_ASC' => 'intern_name_asc', + 'INTERN_NAME_DESC' => 'intern_name_desc', + ]; + } + + protected static function labels(): array + { + return [ + 'ID' => 'Id', + 'ID_ASC' => 'Id Ascending', + 'ID_DESC' => 'Id Descending', + 'INTERN_NAME' => 'Intern Name', + 'INTERN_NAME_ASC' => 'Intern Name Ascending', + 'INTERN_NAME_DESC' => 'Intern Name Descending', + ]; + } +} diff --git a/src/Requests/Items/CreateItemRequest.php b/src/Requests/Items/CreateItemRequest.php new file mode 100644 index 0000000..6e589c6 --- /dev/null +++ b/src/Requests/Items/CreateItemRequest.php @@ -0,0 +1,48 @@ +data; + + if (! $body instanceof CreateEditItemDTO) { + $body = CreateEditItemDTO::fromArray($body); + } + + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): ItemDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return ItemDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/Items/DeleteAnItemRequest.php b/src/Requests/Items/DeleteAnItemRequest.php new file mode 100644 index 0000000..1de2627 --- /dev/null +++ b/src/Requests/Items/DeleteAnItemRequest.php @@ -0,0 +1,31 @@ +article_id; + } + + public function createDtoFromResponse(Response $response): mixed + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return $response->json(); + } +} diff --git a/src/Requests/Items/EditAnItemRequest.php b/src/Requests/Items/EditAnItemRequest.php new file mode 100644 index 0000000..6801dd9 --- /dev/null +++ b/src/Requests/Items/EditAnItemRequest.php @@ -0,0 +1,49 @@ +article_id; + } + + protected function defaultBody(): array + { + $body = $this->data; + + if (! $body instanceof CreateEditItemDTO) { + $body = CreateEditItemDTO::fromArray($body); + } + + return $body->toArray(); + } + + public function createDtoFromResponse(Response $response): ItemDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return ItemDTO::fromArray($response->json()); + } +} diff --git a/src/Requests/Items/FetchAListOfItemsRequest.php b/src/Requests/Items/FetchAListOfItemsRequest.php new file mode 100644 index 0000000..fe7bb5c --- /dev/null +++ b/src/Requests/Items/FetchAListOfItemsRequest.php @@ -0,0 +1,53 @@ + $this->orderBy instanceof OrderByEnum ? $this->orderBy->value : $this->orderBy, + 'limit' => $this->limit, + 'offset' => $this->offset, + ]; + } + + public function createDtoFromResponse(Response $response): Collection + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + $res = $response->json(); + + $items = collect(); + + foreach ($res as $item) { + $items->push(ItemDTO::fromArray($item)); + } + + return $items; + } +} diff --git a/src/Requests/Items/FetchAnItemRequest.php b/src/Requests/Items/FetchAnItemRequest.php new file mode 100644 index 0000000..7bfff46 --- /dev/null +++ b/src/Requests/Items/FetchAnItemRequest.php @@ -0,0 +1,32 @@ +article_id; + } + + public function createDtoFromResponse(Response $response): ItemDTO + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + return ItemDTO::fromResponse($response); + } +} diff --git a/src/Requests/Items/SearchItemsRequest.php b/src/Requests/Items/SearchItemsRequest.php new file mode 100644 index 0000000..426f6f8 --- /dev/null +++ b/src/Requests/Items/SearchItemsRequest.php @@ -0,0 +1,72 @@ + $this->orderBy instanceof OrderByEnum ? $this->orderBy->value : $this->orderBy, + 'limit' => $this->limit, + 'offset' => $this->offset, + ]; + } + + protected function defaultBody(): array + { + return [ + [ + 'field' => $this->searchField, + 'value' => $this->searchTerm, + 'criteria' => $this->searchCriteria instanceof SearchCriteriaEnum ? $this->searchCriteria->value : $this->searchCriteria, + ], + ]; + } + + public function createDtoFromResponse(Response $response): Collection + { + if (! $response->successful()) { + throw new Exception('Request was not successful. Unable to create DTO.'); + } + + $res = $response->json(); + + $items = collect(); + + foreach ($res as $item) { + $items->push(ItemDTO::fromArray($item)); + } + + return $items; + } +} diff --git a/tests/Fixtures/Saloon/Items/create-item.json b/tests/Fixtures/Saloon/Items/create-item.json new file mode 100644 index 0000000..9963f03 --- /dev/null +++ b/tests/Fixtures/Saloon/Items/create-item.json @@ -0,0 +1,2 @@ +{"statusCode":201,"headers":{"Date":"Tue, 02 Jan 2024 11:49:15 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"{\"id\":1,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"master_id\":null,\"deliverer_code\":null,\"deliverer_name\":null,\"deliverer_description\":null,\"intern_code\":\"ITEM-001\",\"intern_name\":\"Test Item\",\"intern_description\":\"Test Description\",\"purchase_price\":\"10.00\",\"sale_price\":\"20.00\",\"purchase_total\":10.0,\"sale_total\":20.0,\"currency_id\":1,\"tax_income_id\":1,\"tax_id\":1,\"tax_expense_id\":1,\"unit_id\":1,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":null,\"remarks\":null,\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}"} + diff --git a/tests/Fixtures/Saloon/Items/delete-an-item.json b/tests/Fixtures/Saloon/Items/delete-an-item.json new file mode 100644 index 0000000..18cfb7a --- /dev/null +++ b/tests/Fixtures/Saloon/Items/delete-an-item.json @@ -0,0 +1,2 @@ +{"statusCode":200,"headers":{"Date":"Tue, 02 Jan 2024 11:49:32 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"{\"success\":true}"} + diff --git a/tests/Fixtures/Saloon/Items/edit-an-item.json b/tests/Fixtures/Saloon/Items/edit-an-item.json new file mode 100644 index 0000000..e14498c --- /dev/null +++ b/tests/Fixtures/Saloon/Items/edit-an-item.json @@ -0,0 +1,2 @@ +{"statusCode":200,"headers":{"Date":"Tue, 02 Jan 2024 11:49:32 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"{\"id\":1,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"master_id\":null,\"deliverer_code\":null,\"deliverer_name\":null,\"deliverer_description\":null,\"intern_code\":\"ITEM-001\",\"intern_name\":\"Updated Item Name\",\"intern_description\":\"Updated Description\",\"purchase_price\":\"15.00\",\"sale_price\":\"25.00\",\"purchase_total\":15.0,\"sale_total\":25.0,\"currency_id\":1,\"tax_income_id\":1,\"tax_id\":1,\"tax_expense_id\":1,\"unit_id\":1,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":null,\"remarks\":null,\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}"} + diff --git a/tests/Fixtures/Saloon/Items/fetch-a-list-of-items.json b/tests/Fixtures/Saloon/Items/fetch-a-list-of-items.json new file mode 100644 index 0000000..6cafe84 --- /dev/null +++ b/tests/Fixtures/Saloon/Items/fetch-a-list-of-items.json @@ -0,0 +1,2 @@ +{"statusCode":200,"headers":{"Date":"Tue, 02 Jan 2024 11:49:32 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"[{\"id\":1,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"master_id\":null,\"deliverer_code\":null,\"deliverer_name\":null,\"deliverer_description\":null,\"intern_code\":\"ITEM-001\",\"intern_name\":\"Test Item\",\"intern_description\":\"Test Description\",\"purchase_price\":\"10.00\",\"sale_price\":\"20.00\",\"purchase_total\":10.0,\"sale_total\":20.0,\"currency_id\":1,\"tax_income_id\":1,\"tax_id\":1,\"tax_expense_id\":1,\"unit_id\":1,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":null,\"remarks\":null,\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}]"} + diff --git a/tests/Fixtures/Saloon/Items/fetch-an-item.json b/tests/Fixtures/Saloon/Items/fetch-an-item.json new file mode 100644 index 0000000..5d63c78 --- /dev/null +++ b/tests/Fixtures/Saloon/Items/fetch-an-item.json @@ -0,0 +1,2 @@ +{"statusCode":200,"headers":{"Date":"Tue, 02 Jan 2024 11:49:32 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"{\"id\":1,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"master_id\":null,\"deliverer_code\":null,\"deliverer_name\":null,\"deliverer_description\":null,\"intern_code\":\"ITEM-001\",\"intern_name\":\"Test Item\",\"intern_description\":\"Test Description\",\"purchase_price\":\"10.00\",\"sale_price\":\"20.00\",\"purchase_total\":10.0,\"sale_total\":20.0,\"currency_id\":1,\"tax_income_id\":1,\"tax_id\":1,\"tax_expense_id\":1,\"unit_id\":1,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":null,\"remarks\":null,\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}"} + diff --git a/tests/Fixtures/Saloon/Items/search-items.json b/tests/Fixtures/Saloon/Items/search-items.json new file mode 100644 index 0000000..6cafe84 --- /dev/null +++ b/tests/Fixtures/Saloon/Items/search-items.json @@ -0,0 +1,2 @@ +{"statusCode":200,"headers":{"Date":"Tue, 02 Jan 2024 11:49:32 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"[{\"id\":1,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"master_id\":null,\"deliverer_code\":null,\"deliverer_name\":null,\"deliverer_description\":null,\"intern_code\":\"ITEM-001\",\"intern_name\":\"Test Item\",\"intern_description\":\"Test Description\",\"purchase_price\":\"10.00\",\"sale_price\":\"20.00\",\"purchase_total\":10.0,\"sale_total\":20.0,\"currency_id\":1,\"tax_income_id\":1,\"tax_id\":1,\"tax_expense_id\":1,\"unit_id\":1,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":null,\"remarks\":null,\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}]"} + diff --git a/tests/Requests/Items/CreateItemRequestTest.php b/tests/Requests/Items/CreateItemRequestTest.php new file mode 100644 index 0000000..5a9e8d9 --- /dev/null +++ b/tests/Requests/Items/CreateItemRequestTest.php @@ -0,0 +1,26 @@ + MockResponse::fixture('Items/create-item'), + ]); + + $connector = new BexioConnector(new ConnectWithToken); + + $response = $connector->send(new CreateItemRequest( + new CreateEditItemDTO( + article_type_id: 1, + intern_code: 'ITEM-001', + intern_name: 'Test Item' + ) + )); + + Saloon::assertSent(CreateItemRequest::class); +}); diff --git a/tests/Requests/Items/DeleteAnItemRequestTest.php b/tests/Requests/Items/DeleteAnItemRequestTest.php new file mode 100644 index 0000000..7e284f6 --- /dev/null +++ b/tests/Requests/Items/DeleteAnItemRequestTest.php @@ -0,0 +1,19 @@ + MockResponse::fixture('Items/delete-an-item'), + ]); + + $connector = new BexioConnector(new ConnectWithToken); + + $response = $connector->send(new DeleteAnItemRequest(article_id: 1)); + + Saloon::assertSent(DeleteAnItemRequest::class); +}); diff --git a/tests/Requests/Items/EditAnItemRequestTest.php b/tests/Requests/Items/EditAnItemRequestTest.php new file mode 100644 index 0000000..20d7a62 --- /dev/null +++ b/tests/Requests/Items/EditAnItemRequestTest.php @@ -0,0 +1,27 @@ + MockResponse::fixture('Items/edit-an-item'), + ]); + + $connector = new BexioConnector(new ConnectWithToken); + + $response = $connector->send(new EditAnItemRequest( + article_id: 1, + new CreateEditItemDTO( + article_type_id: 1, + intern_code: 'ITEM-001', + intern_name: 'Updated Item Name' + ) + )); + + Saloon::assertSent(EditAnItemRequest::class); +}); diff --git a/tests/Requests/Items/FetchAListOfItemsRequestTest.php b/tests/Requests/Items/FetchAListOfItemsRequestTest.php new file mode 100644 index 0000000..6e29bf9 --- /dev/null +++ b/tests/Requests/Items/FetchAListOfItemsRequestTest.php @@ -0,0 +1,19 @@ + MockResponse::fixture('Items/fetch-a-list-of-items'), + ]); + + $connector = new BexioConnector(new ConnectWithToken); + + $response = $connector->send(new FetchAListOfItemsRequest); + + Saloon::assertSent(FetchAListOfItemsRequest::class); +}); diff --git a/tests/Requests/Items/FetchAnItemRequestTest.php b/tests/Requests/Items/FetchAnItemRequestTest.php new file mode 100644 index 0000000..4cf3c7b --- /dev/null +++ b/tests/Requests/Items/FetchAnItemRequestTest.php @@ -0,0 +1,19 @@ + MockResponse::fixture('Items/fetch-an-item'), + ]); + + $connector = new BexioConnector(new ConnectWithToken); + + $response = $connector->send(new FetchAnItemRequest(article_id: 1)); + + Saloon::assertSent(FetchAnItemRequest::class); +}); diff --git a/tests/Requests/Items/SearchItemsRequestTest.php b/tests/Requests/Items/SearchItemsRequestTest.php new file mode 100644 index 0000000..82786b4 --- /dev/null +++ b/tests/Requests/Items/SearchItemsRequestTest.php @@ -0,0 +1,22 @@ + MockResponse::fixture('Items/search-items'), + ]); + + $connector = new BexioConnector(new ConnectWithToken); + + $response = $connector->send(new SearchItemsRequest( + searchField: 'intern_name', + searchTerm: 'Test' + )); + + Saloon::assertSent(SearchItemsRequest::class); +}); From 8bbb80683fc2396680672d986c8723ce9b27d206 Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Wed, 26 Nov 2025 11:37:25 +0100 Subject: [PATCH 2/3] Fixed CI Tests --- .phpunit.cache/test-results | 2 +- tests/Requests/Items/CreateItemRequestTest.php | 5 +++++ tests/Requests/Items/EditAnItemRequestTest.php | 7 ++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 9c647e6..727805b 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":"pest_3.8.4","defects":{"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Contacts\\BulkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\CalendarYears\\CreateCalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\AdditionalAddresses\\CreateAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\IbanPayments\\EditIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\CalendarYears\\SearchCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\AdditionalAddresses\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\CalendarYears\\FetchAListOfCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\QrPayments\\EditQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Taxes\\FetchAListOfTaxesRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAListOfAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":7},"times":{"P\\Tests\\Requests\\ManualEntries\\FetchAListOfManualEntriesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\GetNextReferenceNumberRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0.005,"P\\Tests\\Requests\\Invoices\\CreateAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.005,"P\\Tests\\Requests\\BusinessYears\\FetchAListOfBusinessYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\FetchAListOfFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\FetchANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Reports\\JournalRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\FetchFilesOfAccountingEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\IssueAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_can_store_and_retrieve_an_authenticator":0.022,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_handles_serialization_and_unserialization_correctly":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_uses_configured_cache_store":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_falls_back_to_default_cache_store_when_bexio_cache_store_is_not_configured":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_returns_null_when_cached_data_cannot_be_decrypted":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_can_forget_cached_authenticator":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_returns_null_when_no_authenticator_is_cached":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_refreshes_expired_token_automatically":0.02,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_encrypts_the_authenticator_when_storing":0.003,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAListOfContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\DefaultPositions\\CreateADefaultPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Contacts\\BulkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\ContactAdditionalAddresses\\DeleteAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\CreateContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactRelations\\EditAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CalendarYears\\CreateCalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Accounts\\SearchAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\DeleteATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\FetchFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\EditAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Languages\\FetchAListOfLanguagesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CompanyProfiles\\FetchACompanyProfileRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Users\\FetchAuthenticatedUserRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\CreateAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\EditAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\FetchAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\FetchAListOfCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\FetchAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactSectors\\FetchAListOfContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\FetchAListOfTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\CompanyProfiles\\FetchAListOfCompanyProfilesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_throws_exception_when_required_config_is_missing":0,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_returns_a_new_instance_each_time":0,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_resolves_to_a_ConnectWithOAuth_instance":0,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_returns_ConnectWithOAuth_with_config_values":0,"P\\Tests\\Requests\\Invoices\\SubPositions\\CreateASubPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Core\\ArchTest::__pest_evaluable_it_will_not_use_any_debug_function":0.206,"P\\Tests\\Requests\\ContactAdditionalAddresses\\CreateContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_failed_result_with_custom_redirect":0.005,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_returns_success_result_for_connector_with_authenticator_without_refresh_token":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_always_returns_success_result_for_any_connector":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_failed_result_without_custom_redirect":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_returns_success_result_for_connector_with_expired_authenticator":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_success_result_using_static_method":0,"P\\Tests\\Requests\\Titles\\SearchTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\DownloadFIleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BankAccounts\\FetchAListOfBankAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Salutations\\FetchAListOfSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\Contacts\\SearchContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\IbanPayments\\EditIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactRelations\\CreateContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactRelations\\SearchContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CalendarYears\\SearchCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAListOfAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\SearchContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\DeleteATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\CreateContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\FetchATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CalendarYears\\FetchAListOfCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\DeleteANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\RestoreAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\FetchAListOfTaxesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\GetASingleFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactRelations\\DeleteAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\OAuth\\EndSessionRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Salutations\\EditASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\SearchContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BusinessActivities\\FetchAListOfBusinessActivitiesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\DeleteASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BankAccounts\\FetchASingleBankAccountRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\DeleteACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\CreateANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Files\\DeleteAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\IbanPayments\\CreateIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\QrPayments\\EditQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\SearchFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BusinessYears\\FetchABusinessYearRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\DocumentSettings\\FetchAListOfDocumentSettingsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactSectors\\SearchContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AccountGroups\\FetchAListOfAccountGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\CreateATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\FetchATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\QrPayments\\CreateQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Payments\\FetchAListOfPaymentsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\FetchASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\OAuth\\OpenIDConfigurationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\SearchNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\DeleteFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\OpenID\\FetchUserInfoRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\GetAFilePreviewRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\FetchAListOfContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\ShowPdfRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\VatPeriods\\FetchAVatPeriodRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Units\\FetchAListOfUnitsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Accounts\\FetchAListOfAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Users\\FetchAListOfUsersRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\DeleteAnAdditonalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\FetchAListOfInvoicesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\FetchACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactRelations\\FetchAListOfContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\FetchAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\EditAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CalendarYears\\FetchACalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\SearchAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\DeleteAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\CreateASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\CreateManualEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\SearchSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\EditACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\EditANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\FetchAListOfNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\CreateAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.004,"P\\Tests\\Requests\\IbanPayments\\GetIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Payments\\DeleteAPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Projects\\FetchAListOfProjectsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\CreateCurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\EditAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\EditAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.023,"P\\Tests\\Requests\\Invoices\\CancelAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\DeleteAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\PaymentTypes\\FetchAListOfPaymentTypesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Titles\\EditATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\VatPeriods\\FetchAListOfVatPeriodsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\DeleteAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\FetchExchangeRatesForCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\SetIssuedInvoiceToDraftRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Payments\\CancelAPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\FetchAllPossibleCurrencyCodesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactRelations\\FetchAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\FetchAListOfContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\QrPayments\\GetQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001}} \ No newline at end of file +{"version":"pest_3.8.4","defects":{"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Contacts\\BulkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\CalendarYears\\CreateCalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\AdditionalAddresses\\CreateAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\IbanPayments\\EditIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\CalendarYears\\SearchCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\AdditionalAddresses\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\CalendarYears\\FetchAListOfCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\QrPayments\\EditQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Taxes\\FetchAListOfTaxesRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAListOfAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\Items\\CreateItemRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\Items\\EditAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":8},"times":{"P\\Tests\\Requests\\ManualEntries\\FetchAListOfManualEntriesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\GetNextReferenceNumberRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\CreateAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.004,"P\\Tests\\Requests\\BusinessYears\\FetchAListOfBusinessYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\FetchAListOfFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\FetchANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Reports\\JournalRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\FetchFilesOfAccountingEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\IssueAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_can_store_and_retrieve_an_authenticator":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_handles_serialization_and_unserialization_correctly":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_uses_configured_cache_store":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_falls_back_to_default_cache_store_when_bexio_cache_store_is_not_configured":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_returns_null_when_cached_data_cannot_be_decrypted":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_can_forget_cached_authenticator":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_returns_null_when_no_authenticator_is_cached":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_refreshes_expired_token_automatically":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_encrypts_the_authenticator_when_storing":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAListOfContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\DefaultPositions\\CreateADefaultPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Contacts\\BulkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\ContactAdditionalAddresses\\DeleteAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\CreateContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactRelations\\EditAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\CreateCalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Accounts\\SearchAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\DeleteATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\FetchFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\EditAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Languages\\FetchAListOfLanguagesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CompanyProfiles\\FetchACompanyProfileRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\Users\\FetchAuthenticatedUserRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\AdditionalAddresses\\CreateAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\EditAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\FetchAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchAListOfCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\FetchAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactSectors\\FetchAListOfContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\FetchAListOfTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CompanyProfiles\\FetchAListOfCompanyProfilesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_throws_exception_when_required_config_is_missing":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_returns_a_new_instance_each_time":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_resolves_to_a_ConnectWithOAuth_instance":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_returns_ConnectWithOAuth_with_config_values":0,"P\\Tests\\Requests\\Invoices\\SubPositions\\CreateASubPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Core\\ArchTest::__pest_evaluable_it_will_not_use_any_debug_function":0.212,"P\\Tests\\Requests\\ContactAdditionalAddresses\\CreateContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_failed_result_with_custom_redirect":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_returns_success_result_for_connector_with_authenticator_without_refresh_token":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_always_returns_success_result_for_any_connector":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_failed_result_without_custom_redirect":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_returns_success_result_for_connector_with_expired_authenticator":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_success_result_using_static_method":0,"P\\Tests\\Requests\\Titles\\SearchTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\DownloadFIleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BankAccounts\\FetchAListOfBankAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\FetchAListOfSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\SearchContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\IbanPayments\\EditIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactRelations\\CreateContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0.019,"P\\Tests\\Requests\\ContactRelations\\SearchContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CalendarYears\\SearchCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAListOfAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactGroups\\SearchContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\DeleteATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\CreateContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\FetchATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\FetchAListOfCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\DeleteANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\RestoreAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Taxes\\FetchAListOfTaxesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\GetASingleFileRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactRelations\\DeleteAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\OAuth\\EndSessionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\EditASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactAdditionalAddresses\\SearchContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BusinessActivities\\FetchAListOfBusinessActivitiesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\DeleteASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\BankAccounts\\FetchASingleBankAccountRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\DeleteACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\CreateANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\DeleteAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\IbanPayments\\CreateIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\QrPayments\\EditQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\SearchFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\BusinessYears\\FetchABusinessYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\DocumentSettings\\FetchAListOfDocumentSettingsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactSectors\\SearchContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AccountGroups\\FetchAListOfAccountGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\CreateATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\FetchATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\QrPayments\\CreateQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Payments\\FetchAListOfPaymentsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Salutations\\FetchASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\OAuth\\OpenIDConfigurationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\SearchNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\DeleteFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\OpenID\\FetchUserInfoRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Files\\GetAFilePreviewRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\FetchAListOfContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\ShowPdfRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\VatPeriods\\FetchAVatPeriodRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Units\\FetchAListOfUnitsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Accounts\\FetchAListOfAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Users\\FetchAListOfUsersRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\DeleteAnAdditonalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\FetchAListOfInvoicesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactRelations\\FetchAListOfContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\FetchAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\EditAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\FetchACalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\SearchAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\DeleteAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Salutations\\CreateASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\CreateManualEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\Salutations\\SearchSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\EditACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\EditANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\FetchAListOfNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\CreateAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\IbanPayments\\GetIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Payments\\DeleteAPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Projects\\FetchAListOfProjectsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\CreateCurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\EditAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\EditAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\CancelAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\DeleteAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\PaymentTypes\\FetchAListOfPaymentTypesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\EditATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\VatPeriods\\FetchAListOfVatPeriodsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\DeleteAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchExchangeRatesForCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\SetIssuedInvoiceToDraftRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Payments\\CancelAPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchAllPossibleCurrencyCodesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactRelations\\FetchAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactGroups\\FetchAListOfContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\QrPayments\\GetQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Items\\FetchAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Items\\SearchItemsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Items\\CreateItemRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Items\\EditAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Items\\DeleteAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Items\\FetchAListOfItemsRequestTest::__pest_evaluable_it_can_perform_the_request":0}} \ No newline at end of file diff --git a/tests/Requests/Items/CreateItemRequestTest.php b/tests/Requests/Items/CreateItemRequestTest.php index 5a9e8d9..bb48a95 100644 --- a/tests/Requests/Items/CreateItemRequestTest.php +++ b/tests/Requests/Items/CreateItemRequestTest.php @@ -16,7 +16,12 @@ $response = $connector->send(new CreateItemRequest( new CreateEditItemDTO( + user_id: null, article_type_id: 1, + contact_id: null, + deliverer_code: null, + deliverer_name: null, + deliverer_description: null, intern_code: 'ITEM-001', intern_name: 'Test Item' ) diff --git a/tests/Requests/Items/EditAnItemRequestTest.php b/tests/Requests/Items/EditAnItemRequestTest.php index 20d7a62..0ce0c5f 100644 --- a/tests/Requests/Items/EditAnItemRequestTest.php +++ b/tests/Requests/Items/EditAnItemRequestTest.php @@ -16,8 +16,13 @@ $response = $connector->send(new EditAnItemRequest( article_id: 1, - new CreateEditItemDTO( + data: new CreateEditItemDTO( + user_id: null, article_type_id: 1, + contact_id: null, + deliverer_code: null, + deliverer_name: null, + deliverer_description: null, intern_code: 'ITEM-001', intern_name: 'Updated Item Name' ) From 7d3cd796a54ad3057d02d5f2cedb67a654ebf4da Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Wed, 26 Nov 2025 12:04:54 +0100 Subject: [PATCH 3/3] Updated DTO and tested it with real API for creating fixtures --- .phpunit.cache/test-results | 2 +- README.md | 4 ++ phpunit.xml.dist | 1 + src/Dto/Items/CreateEditItemDTO.php | 2 - src/Requests/Items/CreateItemRequest.php | 2 +- src/Requests/Items/DeleteAnItemRequest.php | 2 +- src/Requests/Items/EditAnItemRequest.php | 8 +++- .../Items/FetchAListOfItemsRequest.php | 2 +- src/Requests/Items/FetchAnItemRequest.php | 2 +- src/Requests/Items/SearchItemsRequest.php | 2 +- tests/Fixtures/Saloon/Items/create-item.json | 26 ++++++++++++- .../Fixtures/Saloon/Items/delete-an-item.json | 26 ++++++++++++- tests/Fixtures/Saloon/Items/edit-an-item.json | 26 ++++++++++++- .../Saloon/Items/fetch-a-list-of-items.json | 26 ++++++++++++- .../Fixtures/Saloon/Items/fetch-an-item.json | 26 ++++++++++++- tests/Fixtures/Saloon/Items/search-items.json | 26 ++++++++++++- tests/Pest.php | 10 +++++ .../Requests/Items/CreateItemRequestTest.php | 14 ++++++- .../Items/DeleteAnItemRequestTest.php | 23 ++++++++++- .../Requests/Items/EditAnItemRequestTest.php | 39 ++++++++++++++----- .../Items/FetchAListOfItemsRequestTest.php | 13 ++++++- .../Requests/Items/FetchAnItemRequestTest.php | 25 +++++++++++- .../Requests/Items/SearchItemsRequestTest.php | 14 ++++++- 23 files changed, 280 insertions(+), 41 deletions(-) diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 727805b..d347c6e 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":"pest_3.8.4","defects":{"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Contacts\\BulkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\CalendarYears\\CreateCalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\AdditionalAddresses\\CreateAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\IbanPayments\\EditIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\CalendarYears\\SearchCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\AdditionalAddresses\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\CalendarYears\\FetchAListOfCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\QrPayments\\EditQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Taxes\\FetchAListOfTaxesRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAListOfAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\Items\\CreateItemRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\Items\\EditAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":8},"times":{"P\\Tests\\Requests\\ManualEntries\\FetchAListOfManualEntriesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\GetNextReferenceNumberRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\CreateAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.004,"P\\Tests\\Requests\\BusinessYears\\FetchAListOfBusinessYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\FetchAListOfFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\FetchANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Reports\\JournalRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\FetchFilesOfAccountingEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\IssueAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_can_store_and_retrieve_an_authenticator":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_handles_serialization_and_unserialization_correctly":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_uses_configured_cache_store":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_falls_back_to_default_cache_store_when_bexio_cache_store_is_not_configured":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_returns_null_when_cached_data_cannot_be_decrypted":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_can_forget_cached_authenticator":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_returns_null_when_no_authenticator_is_cached":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_refreshes_expired_token_automatically":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_encrypts_the_authenticator_when_storing":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAListOfContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\DefaultPositions\\CreateADefaultPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Contacts\\BulkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\ContactAdditionalAddresses\\DeleteAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\CreateContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactRelations\\EditAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\CreateCalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Accounts\\SearchAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\DeleteATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\FetchFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\EditAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Languages\\FetchAListOfLanguagesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CompanyProfiles\\FetchACompanyProfileRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\Users\\FetchAuthenticatedUserRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\AdditionalAddresses\\CreateAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\EditAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\FetchAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchAListOfCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\FetchAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactSectors\\FetchAListOfContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\FetchAListOfTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CompanyProfiles\\FetchAListOfCompanyProfilesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_throws_exception_when_required_config_is_missing":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_returns_a_new_instance_each_time":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_resolves_to_a_ConnectWithOAuth_instance":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_returns_ConnectWithOAuth_with_config_values":0,"P\\Tests\\Requests\\Invoices\\SubPositions\\CreateASubPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Core\\ArchTest::__pest_evaluable_it_will_not_use_any_debug_function":0.212,"P\\Tests\\Requests\\ContactAdditionalAddresses\\CreateContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_failed_result_with_custom_redirect":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_returns_success_result_for_connector_with_authenticator_without_refresh_token":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_always_returns_success_result_for_any_connector":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_failed_result_without_custom_redirect":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_returns_success_result_for_connector_with_expired_authenticator":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_success_result_using_static_method":0,"P\\Tests\\Requests\\Titles\\SearchTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\DownloadFIleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BankAccounts\\FetchAListOfBankAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\FetchAListOfSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\SearchContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\IbanPayments\\EditIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactRelations\\CreateContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0.019,"P\\Tests\\Requests\\ContactRelations\\SearchContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CalendarYears\\SearchCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAListOfAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactGroups\\SearchContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\DeleteATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\CreateContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\FetchATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\FetchAListOfCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\DeleteANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\RestoreAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Taxes\\FetchAListOfTaxesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\GetASingleFileRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactRelations\\DeleteAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\OAuth\\EndSessionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\EditASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactAdditionalAddresses\\SearchContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BusinessActivities\\FetchAListOfBusinessActivitiesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\DeleteASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\BankAccounts\\FetchASingleBankAccountRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\DeleteACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\CreateANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\DeleteAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\IbanPayments\\CreateIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\QrPayments\\EditQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\SearchFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\BusinessYears\\FetchABusinessYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\DocumentSettings\\FetchAListOfDocumentSettingsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactSectors\\SearchContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AccountGroups\\FetchAListOfAccountGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\CreateATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\FetchATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\QrPayments\\CreateQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Payments\\FetchAListOfPaymentsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Salutations\\FetchASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\OAuth\\OpenIDConfigurationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\SearchNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\DeleteFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\OpenID\\FetchUserInfoRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Files\\GetAFilePreviewRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\FetchAListOfContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\ShowPdfRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\VatPeriods\\FetchAVatPeriodRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Units\\FetchAListOfUnitsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Accounts\\FetchAListOfAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Users\\FetchAListOfUsersRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\DeleteAnAdditonalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\FetchAListOfInvoicesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactRelations\\FetchAListOfContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\FetchAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\EditAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\FetchACalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\SearchAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\DeleteAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Salutations\\CreateASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\CreateManualEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\Salutations\\SearchSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\EditACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\EditANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\FetchAListOfNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\CreateAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\IbanPayments\\GetIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Payments\\DeleteAPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Projects\\FetchAListOfProjectsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\CreateCurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\EditAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\EditAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\CancelAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\DeleteAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\PaymentTypes\\FetchAListOfPaymentTypesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\EditATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\VatPeriods\\FetchAListOfVatPeriodsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\DeleteAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchExchangeRatesForCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\SetIssuedInvoiceToDraftRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Payments\\CancelAPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchAllPossibleCurrencyCodesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactRelations\\FetchAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactGroups\\FetchAListOfContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\QrPayments\\GetQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Items\\FetchAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Items\\SearchItemsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Items\\CreateItemRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Items\\EditAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Items\\DeleteAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Items\\FetchAListOfItemsRequestTest::__pest_evaluable_it_can_perform_the_request":0}} \ No newline at end of file +{"version":"pest_3.8.4","defects":{"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Contacts\\BulkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\CalendarYears\\CreateCalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\AdditionalAddresses\\CreateAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\IbanPayments\\EditIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\CalendarYears\\SearchCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\AdditionalAddresses\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":8,"P\\Tests\\Requests\\CalendarYears\\FetchAListOfCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\QrPayments\\EditQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":1,"P\\Tests\\Requests\\Taxes\\FetchAListOfTaxesRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAListOfAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\Items\\CreateItemRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\Items\\EditAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":7,"P\\Tests\\Requests\\Items\\FetchAListOfItemsRequestTest::__pest_evaluable_it_can_perform_the_request":5,"P\\Tests\\Requests\\Items\\FetchAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":7},"times":{"P\\Tests\\Requests\\ManualEntries\\FetchAListOfManualEntriesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\GetNextReferenceNumberRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\AddFileToAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\CreateAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.004,"P\\Tests\\Requests\\BusinessYears\\FetchAListOfBusinessYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\FetchAListOfFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\FetchANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Reports\\JournalRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\FetchFilesOfAccountingEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\IssueAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_can_store_and_retrieve_an_authenticator":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_handles_serialization_and_unserialization_correctly":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_uses_configured_cache_store":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_falls_back_to_default_cache_store_when_bexio_cache_store_is_not_configured":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_returns_null_when_cached_data_cannot_be_decrypted":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_can_forget_cached_authenticator":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_returns_null_when_no_authenticator_is_cached":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_refreshes_expired_token_automatically":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationStoreResolverTest::__pest_evaluable_it_encrypts_the_authenticator_when_storing":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAListOfContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\DefaultPositions\\CreateADefaultPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Contacts\\BulkCreateContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\ContactAdditionalAddresses\\DeleteAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\CreateContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactRelations\\EditAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\CreateCalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Accounts\\SearchAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\DeleteATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ManualEntries\\FetchFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\EditAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Languages\\FetchAListOfLanguagesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CompanyProfiles\\FetchACompanyProfileRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\Users\\FetchAuthenticatedUserRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\AdditionalAddresses\\CreateAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\EditAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\FetchAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchAListOfCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\FetchAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactSectors\\FetchAListOfContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\FetchAListOfTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CompanyProfiles\\FetchAListOfCompanyProfilesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_throws_exception_when_required_config_is_missing":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_returns_a_new_instance_each_time":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_resolves_to_a_ConnectWithOAuth_instance":0.001,"P\\Tests\\Support\\DefaultBexioOAuthConfigResolverTest::__pest_evaluable_it_returns_ConnectWithOAuth_with_config_values":0,"P\\Tests\\Requests\\Invoices\\SubPositions\\CreateASubPositionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Core\\ArchTest::__pest_evaluable_it_will_not_use_any_debug_function":0.212,"P\\Tests\\Requests\\ContactAdditionalAddresses\\CreateContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_failed_result_with_custom_redirect":0.001,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_returns_success_result_for_connector_with_authenticator_without_refresh_token":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_always_returns_success_result_for_any_connector":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_failed_result_without_custom_redirect":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_returns_success_result_for_connector_with_expired_authenticator":0,"P\\Tests\\Support\\DefaultBexioOAuthAuthenticationValidateResolverTest::__pest_evaluable_it_can_create_success_result_using_static_method":0,"P\\Tests\\Requests\\Titles\\SearchTitlesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\DownloadFIleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BankAccounts\\FetchAListOfBankAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\FetchAListOfSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\SearchContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\IbanPayments\\EditIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactRelations\\CreateContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0.019,"P\\Tests\\Requests\\ContactRelations\\SearchContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\CalendarYears\\SearchCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\FetchAListOfAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactGroups\\SearchContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\EditAnAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\DeleteATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\CreateContactRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\FetchATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\FetchAListOfCalendarYearsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\DeleteANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\RestoreAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Taxes\\FetchAListOfTaxesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\GetASingleFileRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactRelations\\DeleteAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\OAuth\\EndSessionRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\EditASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactAdditionalAddresses\\SearchContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\BusinessActivities\\FetchAListOfBusinessActivitiesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Salutations\\DeleteASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\BankAccounts\\FetchASingleBankAccountRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\DeleteACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\CreateANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Files\\DeleteAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\IbanPayments\\CreateIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\QrPayments\\EditQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\SearchFilesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\BusinessYears\\FetchABusinessYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\DocumentSettings\\FetchAListOfDocumentSettingsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactSectors\\SearchContactSectorsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AccountGroups\\FetchAListOfAccountGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\CreateATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Taxes\\FetchATaxRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\QrPayments\\CreateQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Payments\\FetchAListOfPaymentsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Salutations\\FetchASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\ShowFileUsageRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\OAuth\\OpenIDConfigurationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\SearchNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\DeleteFileOfAccountingEntryLineRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\OpenID\\FetchUserInfoRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Files\\GetAFilePreviewRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Contacts\\FetchAListOfContactsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\ShowPdfRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\VatPeriods\\FetchAVatPeriodRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Units\\FetchAListOfUnitsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Accounts\\FetchAListOfAccountsRequestTest::__pest_evaluable_it_can_perform_the_request":0.002,"P\\Tests\\Requests\\Users\\FetchAListOfUsersRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\AdditionalAddresses\\DeleteAnAdditonalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\FetchAListOfInvoicesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactRelations\\FetchAListOfContactRelationsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\FetchAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\EditAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\CalendarYears\\FetchACalendarYearRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\AdditionalAddresses\\SearchAdditionalAddressesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\DeleteAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Salutations\\CreateASalutationRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\FetchAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ManualEntries\\CreateManualEntryRequestTest::__pest_evaluable_it_can_perform_the_request":0.003,"P\\Tests\\Requests\\Salutations\\SearchSalutationsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\EditACurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Notes\\EditANoteRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Notes\\FetchAListOfNotesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Files\\CreateAFileRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\IbanPayments\\GetIbanPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Payments\\DeleteAPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Projects\\FetchAListOfProjectsRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Currencies\\CreateCurrencyRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactAdditionalAddresses\\EditAContactAdditionalAddressRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\EditAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Invoices\\CancelAnInvoiceRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactGroups\\DeleteAContactGroupRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\PaymentTypes\\FetchAListOfPaymentTypesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\Titles\\EditATitleRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\VatPeriods\\FetchAListOfVatPeriodsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Contacts\\DeleteAContactRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchExchangeRatesForCurrenciesRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Invoices\\SetIssuedInvoiceToDraftRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Payments\\CancelAPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Currencies\\FetchAllPossibleCurrencyCodesRequestTest::__pest_evaluable_it_can_perform_the_request":0.001,"P\\Tests\\Requests\\ContactRelations\\FetchAContactRelationRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\ContactGroups\\FetchAListOfContactGroupsRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\QrPayments\\GetQrPaymentRequestTest::__pest_evaluable_it_can_perform_the_request":0,"P\\Tests\\Requests\\Items\\FetchAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":0.357,"P\\Tests\\Requests\\Items\\SearchItemsRequestTest::__pest_evaluable_it_can_perform_the_request":0.25,"P\\Tests\\Requests\\Items\\CreateItemRequestTest::__pest_evaluable_it_can_perform_the_request":0.196,"P\\Tests\\Requests\\Items\\EditAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":0.542,"P\\Tests\\Requests\\Items\\DeleteAnItemRequestTest::__pest_evaluable_it_can_perform_the_request":0.394,"P\\Tests\\Requests\\Items\\FetchAListOfItemsRequestTest::__pest_evaluable_it_can_perform_the_request":0.326}} \ No newline at end of file diff --git a/README.md b/README.md index d1a1886..a76a101 100644 --- a/README.md +++ b/README.md @@ -2040,6 +2040,7 @@ $items = $connector->send(new SearchItemsRequest( */ $item = $connector->send(new CreateItemRequest( data: new CreateEditItemDTO( + user_id: 1, article_type_id: 1, intern_code: 'ITEM-001', intern_name: 'Test Item', @@ -2047,6 +2048,8 @@ $item = $connector->send(new CreateItemRequest( sale_price: '20.00', purchase_price: '10.00', currency_id: 1, + tax_income_id: 14, + tax_expense_id: 21, unit_id: 1, ) ))->dto(); @@ -2059,6 +2062,7 @@ $item = $connector->send(new CreateItemRequest( $item = $connector->send(new EditAnItemRequest( article_id: 1, data: new CreateEditItemDTO( + user_id: 1, article_type_id: 1, intern_code: 'ITEM-001', intern_name: 'Updated Item Name', diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 7c66551..4d12b3d 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -22,6 +22,7 @@ + diff --git a/src/Dto/Items/CreateEditItemDTO.php b/src/Dto/Items/CreateEditItemDTO.php index 30d791c..1a0920b 100644 --- a/src/Dto/Items/CreateEditItemDTO.php +++ b/src/Dto/Items/CreateEditItemDTO.php @@ -25,7 +25,6 @@ public function __construct( public ?float $sale_total = null, public ?int $currency_id = null, public ?int $tax_income_id = null, - public ?int $tax_id = null, public ?int $tax_expense_id = null, public ?int $unit_id = null, public bool $is_stock = false, @@ -78,7 +77,6 @@ public static function fromArray(array $data): self sale_total: Arr::get($data, 'sale_total'), currency_id: Arr::get($data, 'currency_id'), tax_income_id: Arr::get($data, 'tax_income_id'), - tax_id: Arr::get($data, 'tax_id'), tax_expense_id: Arr::get($data, 'tax_expense_id'), unit_id: Arr::get($data, 'unit_id'), is_stock: Arr::get($data, 'is_stock', false), diff --git a/src/Requests/Items/CreateItemRequest.php b/src/Requests/Items/CreateItemRequest.php index 6e589c6..edeb430 100644 --- a/src/Requests/Items/CreateItemRequest.php +++ b/src/Requests/Items/CreateItemRequest.php @@ -23,7 +23,7 @@ public function __construct( public function resolveEndpoint(): string { - return '/3.0/article'; + return '/2.0/article'; } protected function defaultBody(): array diff --git a/src/Requests/Items/DeleteAnItemRequest.php b/src/Requests/Items/DeleteAnItemRequest.php index 1de2627..e97485b 100644 --- a/src/Requests/Items/DeleteAnItemRequest.php +++ b/src/Requests/Items/DeleteAnItemRequest.php @@ -17,7 +17,7 @@ public function __construct( public function resolveEndpoint(): string { - return '/3.0/article/'.$this->article_id; + return '/2.0/article/'.$this->article_id; } public function createDtoFromResponse(Response $response): mixed diff --git a/src/Requests/Items/EditAnItemRequest.php b/src/Requests/Items/EditAnItemRequest.php index 6801dd9..0965607 100644 --- a/src/Requests/Items/EditAnItemRequest.php +++ b/src/Requests/Items/EditAnItemRequest.php @@ -24,7 +24,7 @@ public function __construct( public function resolveEndpoint(): string { - return '/3.0/article/'.$this->article_id; + return '/2.0/article/'.$this->article_id; } protected function defaultBody(): array @@ -35,7 +35,11 @@ protected function defaultBody(): array $body = CreateEditItemDTO::fromArray($body); } - return $body->toArray(); + $data = $body->toArray(); + + unset($data['article_type_id']); + + return $data; } public function createDtoFromResponse(Response $response): ItemDTO diff --git a/src/Requests/Items/FetchAListOfItemsRequest.php b/src/Requests/Items/FetchAListOfItemsRequest.php index fe7bb5c..2beaa23 100644 --- a/src/Requests/Items/FetchAListOfItemsRequest.php +++ b/src/Requests/Items/FetchAListOfItemsRequest.php @@ -22,7 +22,7 @@ public function __construct( public function resolveEndpoint(): string { - return '/3.0/article'; + return '/2.0/article'; } public function defaultQuery(): array diff --git a/src/Requests/Items/FetchAnItemRequest.php b/src/Requests/Items/FetchAnItemRequest.php index 7bfff46..f4f9cc2 100644 --- a/src/Requests/Items/FetchAnItemRequest.php +++ b/src/Requests/Items/FetchAnItemRequest.php @@ -18,7 +18,7 @@ public function __construct( public function resolveEndpoint(): string { - return '/3.0/article/'.$this->article_id; + return '/2.0/article/'.$this->article_id; } public function createDtoFromResponse(Response $response): ItemDTO diff --git a/src/Requests/Items/SearchItemsRequest.php b/src/Requests/Items/SearchItemsRequest.php index 426f6f8..91e62c4 100644 --- a/src/Requests/Items/SearchItemsRequest.php +++ b/src/Requests/Items/SearchItemsRequest.php @@ -30,7 +30,7 @@ public function __construct( public function resolveEndpoint(): string { - return '/3.0/article/search'; + return '/2.0/article/search'; } public function defaultQuery(): array diff --git a/tests/Fixtures/Saloon/Items/create-item.json b/tests/Fixtures/Saloon/Items/create-item.json index 9963f03..1605918 100644 --- a/tests/Fixtures/Saloon/Items/create-item.json +++ b/tests/Fixtures/Saloon/Items/create-item.json @@ -1,2 +1,24 @@ -{"statusCode":201,"headers":{"Date":"Tue, 02 Jan 2024 11:49:15 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"{\"id\":1,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"master_id\":null,\"deliverer_code\":null,\"deliverer_name\":null,\"deliverer_description\":null,\"intern_code\":\"ITEM-001\",\"intern_name\":\"Test Item\",\"intern_description\":\"Test Description\",\"purchase_price\":\"10.00\",\"sale_price\":\"20.00\",\"purchase_total\":10.0,\"sale_total\":20.0,\"currency_id\":1,\"tax_income_id\":1,\"tax_id\":1,\"tax_expense_id\":1,\"unit_id\":1,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":null,\"remarks\":null,\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}"} - +{ + "statusCode": 201, + "headers": { + "Date": "Wed, 26 Nov 2025 11:03:45 GMT", + "Content-Type": "application\/json", + "Content-Length": "753", + "Connection": "keep-alive", + "CF-RAY": "9a48e6ace936ff00-ZRH", + "ratelimit-reset": "15", + "x-ratelimit-limit-minute": "400", + "x-ratelimit-remaining-minute": "384", + "ratelimit-limit": "400", + "ratelimit-remaining": "384", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare" + }, + "data": "{\"id\":7,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"deliverer_code\":\"\",\"deliverer_name\":\"\",\"deliverer_description\":\"\",\"intern_code\":\"TEST-1764155025\",\"intern_name\":\"Test Item\",\"intern_description\":\"\",\"purchase_price\":null,\"sale_price\":null,\"purchase_total\":null,\"sale_total\":null,\"currency_id\":1,\"tax_income_id\":null,\"tax_id\":null,\"tax_expense_id\":null,\"unit_id\":null,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":\"0\",\"stock_min_nr\":\"0\",\"stock_reserved_nr\":\"0\",\"stock_available_nr\":0,\"stock_picked_nr\":\"0\",\"stock_disposed_nr\":\"0\",\"stock_ordered_nr\":\"0\",\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":\"\",\"remarks\":\"\",\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Items/delete-an-item.json b/tests/Fixtures/Saloon/Items/delete-an-item.json index 18cfb7a..8abfa33 100644 --- a/tests/Fixtures/Saloon/Items/delete-an-item.json +++ b/tests/Fixtures/Saloon/Items/delete-an-item.json @@ -1,2 +1,24 @@ -{"statusCode":200,"headers":{"Date":"Tue, 02 Jan 2024 11:49:32 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"{\"success\":true}"} - +{ + "statusCode": 200, + "headers": { + "Date": "Wed, 26 Nov 2025 11:03:44 GMT", + "Content-Type": "application\/json", + "Content-Length": "16", + "Connection": "keep-alive", + "CF-RAY": "9a48e6a7aea92325-ZRH", + "x-ratelimit-remaining-minute": "387", + "x-ratelimit-limit-minute": "400", + "ratelimit-remaining": "387", + "ratelimit-limit": "400", + "ratelimit-reset": "16", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare" + }, + "data": "{\"success\":true}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Items/edit-an-item.json b/tests/Fixtures/Saloon/Items/edit-an-item.json index e14498c..969d369 100644 --- a/tests/Fixtures/Saloon/Items/edit-an-item.json +++ b/tests/Fixtures/Saloon/Items/edit-an-item.json @@ -1,2 +1,24 @@ -{"statusCode":200,"headers":{"Date":"Tue, 02 Jan 2024 11:49:32 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"{\"id\":1,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"master_id\":null,\"deliverer_code\":null,\"deliverer_name\":null,\"deliverer_description\":null,\"intern_code\":\"ITEM-001\",\"intern_name\":\"Updated Item Name\",\"intern_description\":\"Updated Description\",\"purchase_price\":\"15.00\",\"sale_price\":\"25.00\",\"purchase_total\":15.0,\"sale_total\":25.0,\"currency_id\":1,\"tax_income_id\":1,\"tax_id\":1,\"tax_expense_id\":1,\"unit_id\":1,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":null,\"remarks\":null,\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}"} - +{ + "statusCode": 200, + "headers": { + "Date": "Wed, 26 Nov 2025 11:03:45 GMT", + "Content-Type": "application\/json", + "Content-Length": "756", + "Connection": "keep-alive", + "CF-RAY": "9a48e6aacd3bbe70-ZRH", + "ratelimit-remaining": "385", + "ratelimit-reset": "15", + "x-ratelimit-limit-minute": "400", + "x-ratelimit-remaining-minute": "385", + "ratelimit-limit": "400", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare" + }, + "data": "{\"id\":4,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"deliverer_code\":\"\",\"deliverer_name\":\"\",\"deliverer_description\":\"\",\"intern_code\":\"TEST-1764154703\",\"intern_name\":\"Updated Item Name\",\"intern_description\":\"\",\"purchase_price\":null,\"sale_price\":null,\"purchase_total\":null,\"sale_total\":null,\"currency_id\":null,\"tax_income_id\":null,\"tax_id\":null,\"tax_expense_id\":null,\"unit_id\":null,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":\"0\",\"stock_min_nr\":\"0\",\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":\"\",\"remarks\":\"\",\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Items/fetch-a-list-of-items.json b/tests/Fixtures/Saloon/Items/fetch-a-list-of-items.json index 6cafe84..f58c8c7 100644 --- a/tests/Fixtures/Saloon/Items/fetch-a-list-of-items.json +++ b/tests/Fixtures/Saloon/Items/fetch-a-list-of-items.json @@ -1,2 +1,24 @@ -{"statusCode":200,"headers":{"Date":"Tue, 02 Jan 2024 11:49:32 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"[{\"id\":1,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"master_id\":null,\"deliverer_code\":null,\"deliverer_name\":null,\"deliverer_description\":null,\"intern_code\":\"ITEM-001\",\"intern_name\":\"Test Item\",\"intern_description\":\"Test Description\",\"purchase_price\":\"10.00\",\"sale_price\":\"20.00\",\"purchase_total\":10.0,\"sale_total\":20.0,\"currency_id\":1,\"tax_income_id\":1,\"tax_id\":1,\"tax_expense_id\":1,\"unit_id\":1,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":null,\"remarks\":null,\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}]"} - +{ + "statusCode": 200, + "headers": { + "Date": "Wed, 26 Nov 2025 11:03:45 GMT", + "Content-Type": "application\/json", + "Content-Length": "2227", + "Connection": "keep-alive", + "CF-RAY": "9a48e6a96c2bbe70-ZRH", + "x-ratelimit-remaining-minute": "386", + "ratelimit-limit": "400", + "ratelimit-remaining": "386", + "ratelimit-reset": "16", + "x-ratelimit-limit-minute": "400", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare" + }, + "data": "[{\"id\":4,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"deliverer_code\":\"\",\"deliverer_name\":\"\",\"deliverer_description\":\"\",\"intern_code\":\"TEST-1764154703\",\"intern_name\":\"Test Item\",\"intern_description\":\"\",\"purchase_price\":null,\"sale_price\":null,\"purchase_total\":null,\"sale_total\":null,\"currency_id\":1,\"tax_income_id\":null,\"tax_id\":null,\"tax_expense_id\":null,\"unit_id\":null,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":\"\",\"remarks\":\"\",\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null},{\"id\":5,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"deliverer_code\":\"\",\"deliverer_name\":\"\",\"deliverer_description\":\"\",\"intern_code\":\"TEST-1764154888\",\"intern_name\":\"Test Item\",\"intern_description\":\"\",\"purchase_price\":null,\"sale_price\":null,\"purchase_total\":null,\"sale_total\":null,\"currency_id\":1,\"tax_income_id\":null,\"tax_id\":null,\"tax_expense_id\":null,\"unit_id\":null,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":\"\",\"remarks\":\"\",\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null},{\"id\":6,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"deliverer_code\":\"\",\"deliverer_name\":\"\",\"deliverer_description\":\"\",\"intern_code\":\"TEST-1764154940\",\"intern_name\":\"Test Item\",\"intern_description\":\"\",\"purchase_price\":null,\"sale_price\":null,\"purchase_total\":null,\"sale_total\":null,\"currency_id\":1,\"tax_income_id\":null,\"tax_id\":null,\"tax_expense_id\":null,\"unit_id\":null,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":\"\",\"remarks\":\"\",\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}]", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Items/fetch-an-item.json b/tests/Fixtures/Saloon/Items/fetch-an-item.json index 5d63c78..a068706 100644 --- a/tests/Fixtures/Saloon/Items/fetch-an-item.json +++ b/tests/Fixtures/Saloon/Items/fetch-an-item.json @@ -1,2 +1,24 @@ -{"statusCode":200,"headers":{"Date":"Tue, 02 Jan 2024 11:49:32 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"{\"id\":1,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"master_id\":null,\"deliverer_code\":null,\"deliverer_name\":null,\"deliverer_description\":null,\"intern_code\":\"ITEM-001\",\"intern_name\":\"Test Item\",\"intern_description\":\"Test Description\",\"purchase_price\":\"10.00\",\"sale_price\":\"20.00\",\"purchase_total\":10.0,\"sale_total\":20.0,\"currency_id\":1,\"tax_income_id\":1,\"tax_id\":1,\"tax_expense_id\":1,\"unit_id\":1,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":null,\"remarks\":null,\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}"} - +{ + "statusCode": 200, + "headers": { + "Date": "Wed, 26 Nov 2025 11:03:44 GMT", + "Content-Type": "application\/json", + "Content-Length": "752", + "Connection": "keep-alive", + "CF-RAY": "9a48e6a5bbafbc47-ZRH", + "x-ratelimit-remaining-minute": "389", + "ratelimit-limit": "400", + "ratelimit-remaining": "389", + "ratelimit-reset": "16", + "x-ratelimit-limit-minute": "400", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare" + }, + "data": "{\"id\":3,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"deliverer_code\":\"\",\"deliverer_name\":\"\",\"deliverer_description\":\"\",\"intern_code\":\"TEST-1764154690\",\"intern_name\":\"Updated Item Name\",\"intern_description\":\"\",\"purchase_price\":null,\"sale_price\":null,\"purchase_total\":null,\"sale_total\":null,\"currency_id\":null,\"tax_income_id\":null,\"tax_id\":null,\"tax_expense_id\":null,\"unit_id\":null,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":\"\",\"remarks\":\"\",\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}", + "context": [] +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Items/search-items.json b/tests/Fixtures/Saloon/Items/search-items.json index 6cafe84..051bd6d 100644 --- a/tests/Fixtures/Saloon/Items/search-items.json +++ b/tests/Fixtures/Saloon/Items/search-items.json @@ -1,2 +1,24 @@ -{"statusCode":200,"headers":{"Date":"Tue, 02 Jan 2024 11:49:32 GMT","Content-Type":"application\/json","Connection":"keep-alive"},"data":"[{\"id\":1,\"user_id\":1,\"article_type_id\":1,\"contact_id\":null,\"master_id\":null,\"deliverer_code\":null,\"deliverer_name\":null,\"deliverer_description\":null,\"intern_code\":\"ITEM-001\",\"intern_name\":\"Test Item\",\"intern_description\":\"Test Description\",\"purchase_price\":\"10.00\",\"sale_price\":\"20.00\",\"purchase_total\":10.0,\"sale_total\":20.0,\"currency_id\":1,\"tax_income_id\":1,\"tax_id\":1,\"tax_expense_id\":1,\"unit_id\":1,\"is_stock\":false,\"stock_id\":null,\"stock_place_id\":null,\"stock_nr\":0,\"stock_min_nr\":0,\"stock_reserved_nr\":0,\"stock_available_nr\":0,\"stock_picked_nr\":0,\"stock_disposed_nr\":0,\"stock_ordered_nr\":0,\"width\":null,\"height\":null,\"weight\":null,\"volume\":null,\"html_text\":null,\"remarks\":null,\"delivery_price\":null,\"article_group_id\":null,\"account_id\":null,\"expense_account_id\":null}]"} - +{ + "statusCode": 200, + "headers": { + "Date": "Wed, 26 Nov 2025 11:03:45 GMT", + "Content-Type": "application\/json", + "Content-Length": "2", + "Connection": "keep-alive", + "CF-RAY": "9a48e6ae3e110396-ZRH", + "ratelimit-reset": "15", + "x-ratelimit-remaining-minute": "249", + "x-ratelimit-limit-minute": "250", + "ratelimit-remaining": "249", + "ratelimit-limit": "250", + "Cache-Control": "no-store", + "pragma": "no-cache", + "vary": "Origin", + "access-control-allow-origin": "https:\/\/office.bexio.com", + "via": "1.1 google", + "cf-cache-status": "DYNAMIC", + "Server": "cloudflare" + }, + "data": "[]", + "context": [] +} \ No newline at end of file diff --git a/tests/Pest.php b/tests/Pest.php index 46258fc..d35a8eb 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -12,3 +12,13 @@ Saloon::fake([]); }) ->in(__DIR__); + +/** + * Helper function to check if fixtures should be reset/regenerated. + * Set RESET_FIXTURES=true in phpunit.xml to regenerate fixtures from live API. + * Defaults to false (use existing fixtures). + */ +function shouldResetFixtures(): bool +{ + return filter_var(getenv('RESET_FIXTURES') ?: false, FILTER_VALIDATE_BOOLEAN); +} diff --git a/tests/Requests/Items/CreateItemRequestTest.php b/tests/Requests/Items/CreateItemRequestTest.php index bb48a95..1ce7c84 100644 --- a/tests/Requests/Items/CreateItemRequestTest.php +++ b/tests/Requests/Items/CreateItemRequestTest.php @@ -2,12 +2,19 @@ use CodebarAg\Bexio\BexioConnector; use CodebarAg\Bexio\Dto\Items\CreateEditItemDTO; +use CodebarAg\Bexio\Dto\Items\ItemDTO; use CodebarAg\Bexio\Dto\OAuthConfiguration\ConnectWithToken; use CodebarAg\Bexio\Requests\Items\CreateItemRequest; use Saloon\Http\Faking\MockResponse; use Saloon\Laravel\Saloon; it('can perform the request', closure: function () { + $fixturePath = __DIR__.'/../../Fixtures/Saloon/Items/create-item.json'; + + if (shouldResetFixtures()) { + unlink($fixturePath); + } + Saloon::fake([ CreateItemRequest::class => MockResponse::fixture('Items/create-item'), ]); @@ -22,10 +29,13 @@ deliverer_code: null, deliverer_name: null, deliverer_description: null, - intern_code: 'ITEM-001', + intern_code: 'TEST-'.time(), intern_name: 'Test Item' ) )); + expect($response->successful())->toBeTrue(); + expect($response->dto())->toBeInstanceOf(ItemDTO::class); + Saloon::assertSent(CreateItemRequest::class); -}); +})->group('items'); diff --git a/tests/Requests/Items/DeleteAnItemRequestTest.php b/tests/Requests/Items/DeleteAnItemRequestTest.php index 7e284f6..b567140 100644 --- a/tests/Requests/Items/DeleteAnItemRequestTest.php +++ b/tests/Requests/Items/DeleteAnItemRequestTest.php @@ -3,17 +3,36 @@ use CodebarAg\Bexio\BexioConnector; use CodebarAg\Bexio\Dto\OAuthConfiguration\ConnectWithToken; use CodebarAg\Bexio\Requests\Items\DeleteAnItemRequest; +use CodebarAg\Bexio\Requests\Items\FetchAListOfItemsRequest; use Saloon\Http\Faking\MockResponse; use Saloon\Laravel\Saloon; it('can perform the request', closure: function () { + $fixturePath = __DIR__.'/../../Fixtures/Saloon/Items/delete-an-item.json'; + $listFixturePath = __DIR__.'/../../Fixtures/Saloon/Items/fetch-a-list-of-items.json'; + + if (shouldResetFixtures()) { + @unlink($fixturePath); + @unlink($listFixturePath); + } + Saloon::fake([ DeleteAnItemRequest::class => MockResponse::fixture('Items/delete-an-item'), + FetchAListOfItemsRequest::class => MockResponse::fixture('Items/fetch-a-list-of-items'), ]); $connector = new BexioConnector(new ConnectWithToken); - $response = $connector->send(new DeleteAnItemRequest(article_id: 1)); + $itemsResponse = $connector->send(new FetchAListOfItemsRequest); + $existingItem = $itemsResponse->dto()->first(); + + if (! $existingItem) { + $this->markTestSkipped('No items found in the system to delete'); + } + + $response = $connector->send(new DeleteAnItemRequest(article_id: $existingItem->id)); + + expect($response->successful())->toBeTrue(); Saloon::assertSent(DeleteAnItemRequest::class); -}); +})->group('items'); diff --git a/tests/Requests/Items/EditAnItemRequestTest.php b/tests/Requests/Items/EditAnItemRequestTest.php index 0ce0c5f..1b9d5f4 100644 --- a/tests/Requests/Items/EditAnItemRequestTest.php +++ b/tests/Requests/Items/EditAnItemRequestTest.php @@ -2,31 +2,52 @@ use CodebarAg\Bexio\BexioConnector; use CodebarAg\Bexio\Dto\Items\CreateEditItemDTO; +use CodebarAg\Bexio\Dto\Items\ItemDTO; use CodebarAg\Bexio\Dto\OAuthConfiguration\ConnectWithToken; use CodebarAg\Bexio\Requests\Items\EditAnItemRequest; +use CodebarAg\Bexio\Requests\Items\FetchAListOfItemsRequest; use Saloon\Http\Faking\MockResponse; use Saloon\Laravel\Saloon; it('can perform the request', closure: function () { + $fixturePath = __DIR__.'/../../Fixtures/Saloon/Items/edit-an-item.json'; + $listFixturePath = __DIR__.'/../../Fixtures/Saloon/Items/fetch-a-list-of-items.json'; + + if (shouldResetFixtures()) { + @unlink($fixturePath); + @unlink($listFixturePath); + } + Saloon::fake([ EditAnItemRequest::class => MockResponse::fixture('Items/edit-an-item'), + FetchAListOfItemsRequest::class => MockResponse::fixture('Items/fetch-a-list-of-items'), ]); $connector = new BexioConnector(new ConnectWithToken); + $itemsResponse = $connector->send(new FetchAListOfItemsRequest); + $existingItem = $itemsResponse->dto()->first(); + + if (! $existingItem) { + $this->markTestSkipped('No items found in the system to edit'); + } + $response = $connector->send(new EditAnItemRequest( - article_id: 1, + article_id: $existingItem->id, data: new CreateEditItemDTO( - user_id: null, - article_type_id: 1, - contact_id: null, - deliverer_code: null, - deliverer_name: null, - deliverer_description: null, - intern_code: 'ITEM-001', + user_id: $existingItem->user_id, + article_type_id: $existingItem->article_type_id, + contact_id: $existingItem->contact_id, + deliverer_code: $existingItem->deliverer_code, + deliverer_name: $existingItem->deliverer_name, + deliverer_description: $existingItem->deliverer_description, + intern_code: $existingItem->intern_code, intern_name: 'Updated Item Name' ) )); + expect($response->successful())->toBeTrue(); + expect($response->dto())->toBeInstanceOf(ItemDTO::class); + Saloon::assertSent(EditAnItemRequest::class); -}); +})->group('items'); diff --git a/tests/Requests/Items/FetchAListOfItemsRequestTest.php b/tests/Requests/Items/FetchAListOfItemsRequestTest.php index 6e29bf9..9260ce9 100644 --- a/tests/Requests/Items/FetchAListOfItemsRequestTest.php +++ b/tests/Requests/Items/FetchAListOfItemsRequestTest.php @@ -3,17 +3,26 @@ use CodebarAg\Bexio\BexioConnector; use CodebarAg\Bexio\Dto\OAuthConfiguration\ConnectWithToken; use CodebarAg\Bexio\Requests\Items\FetchAListOfItemsRequest; +use Illuminate\Support\Collection; use Saloon\Http\Faking\MockResponse; use Saloon\Laravel\Saloon; it('can perform the request', closure: function () { + $fixturePath = __DIR__.'/../../Fixtures/Saloon/Items/fetch-a-list-of-items.json'; + + if (shouldResetFixtures()) { + unlink($fixturePath); + } + Saloon::fake([ FetchAListOfItemsRequest::class => MockResponse::fixture('Items/fetch-a-list-of-items'), ]); $connector = new BexioConnector(new ConnectWithToken); - $response = $connector->send(new FetchAListOfItemsRequest); + expect($response->successful())->toBeTrue(); + expect($response->dto())->toBeInstanceOf(Collection::class); + Saloon::assertSent(FetchAListOfItemsRequest::class); -}); +})->group('items'); diff --git a/tests/Requests/Items/FetchAnItemRequestTest.php b/tests/Requests/Items/FetchAnItemRequestTest.php index 4cf3c7b..93e16f7 100644 --- a/tests/Requests/Items/FetchAnItemRequestTest.php +++ b/tests/Requests/Items/FetchAnItemRequestTest.php @@ -1,19 +1,40 @@ MockResponse::fixture('Items/fetch-an-item'), + FetchAListOfItemsRequest::class => MockResponse::fixture('Items/fetch-a-list-of-items'), ]); $connector = new BexioConnector(new ConnectWithToken); - $response = $connector->send(new FetchAnItemRequest(article_id: 1)); + $itemsResponse = $connector->send(new FetchAListOfItemsRequest); + $existingItem = $itemsResponse->dto()->first(); + + if (! $existingItem) { + $this->markTestSkipped('No items found in the system to fetch'); + } + + $response = $connector->send(new FetchAnItemRequest(article_id: $existingItem->id)); + + expect($response->successful())->toBeTrue(); + expect($response->dto())->toBeInstanceOf(ItemDTO::class); Saloon::assertSent(FetchAnItemRequest::class); -}); +})->group('items'); diff --git a/tests/Requests/Items/SearchItemsRequestTest.php b/tests/Requests/Items/SearchItemsRequestTest.php index 82786b4..09718cb 100644 --- a/tests/Requests/Items/SearchItemsRequestTest.php +++ b/tests/Requests/Items/SearchItemsRequestTest.php @@ -3,10 +3,17 @@ use CodebarAg\Bexio\BexioConnector; use CodebarAg\Bexio\Dto\OAuthConfiguration\ConnectWithToken; use CodebarAg\Bexio\Requests\Items\SearchItemsRequest; +use Illuminate\Support\Collection; use Saloon\Http\Faking\MockResponse; use Saloon\Laravel\Saloon; it('can perform the request', closure: function () { + $fixturePath = __DIR__.'/../../Fixtures/Saloon/Items/search-items.json'; + + if (shouldResetFixtures()) { + unlink($fixturePath); + } + Saloon::fake([ SearchItemsRequest::class => MockResponse::fixture('Items/search-items'), ]); @@ -15,8 +22,11 @@ $response = $connector->send(new SearchItemsRequest( searchField: 'intern_name', - searchTerm: 'Test' + searchTerm: 'DocuWare' )); + expect($response->successful())->toBeTrue(); + expect($response->dto())->toBeInstanceOf(Collection::class); + Saloon::assertSent(SearchItemsRequest::class); -}); +})->group('items');