xero-8.x-2.x-dev/tests/src/Kernel/Plugin/DataType/XeroDataTypeTest.php
tests/src/Kernel/Plugin/DataType/XeroDataTypeTest.php
<?php
namespace Drupal\Tests\xero\Kernel\Plugin\DataType;
use Drupal\Core\TypedData\TypedDataTrait;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\xero\Traits\XeroGuidTrait;
use Drupal\xero\Plugin\DataType\Account;
use Drupal\xero\Plugin\DataType\Address;
use Drupal\xero\Plugin\DataType\BankTransaction;
use Drupal\xero\Plugin\DataType\BankTransfer;
use Drupal\xero\Plugin\DataType\BrandingTheme;
use Drupal\xero\Plugin\DataType\Contact;
use Drupal\xero\Plugin\DataType\ContactGroup;
use Drupal\xero\Plugin\DataType\CreditNote;
use Drupal\xero\Plugin\DataType\Currency;
use Drupal\xero\Plugin\DataType\Detail;
use Drupal\xero\Plugin\DataType\Employee;
use Drupal\xero\Plugin\DataType\Expense;
use Drupal\xero\Plugin\DataType\Invoice;
use Drupal\xero\Plugin\DataType\InvoiceReminder;
use Drupal\xero\Plugin\DataType\Item;
use Drupal\xero\Plugin\DataType\Journal;
use Drupal\xero\Plugin\DataType\JournalLine;
use Drupal\xero\Plugin\DataType\LineItem;
use Drupal\xero\Plugin\DataType\Link;
use Drupal\xero\Plugin\DataType\LinkedTransaction;
use Drupal\xero\Plugin\DataType\Organisation;
use Drupal\xero\Plugin\DataType\Payment;
use Drupal\xero\Plugin\DataType\Phone;
use Drupal\xero\Plugin\DataType\Receipt;
use Drupal\xero\Plugin\DataType\RepeatingInvoice;
use Drupal\xero\Plugin\DataType\Schedule;
use Drupal\xero\Plugin\DataType\TaxComponent;
use Drupal\xero\Plugin\DataType\TaxRate;
use Drupal\xero\Plugin\DataType\TrackingCategory;
use Drupal\xero\Plugin\DataType\TrackingOption;
use Drupal\xero\Plugin\DataType\User;
use Drupal\xero\TypedData\Definition\AccountDefinition;
use Drupal\xero\TypedData\Definition\AddressDefinition;
use Drupal\xero\TypedData\Definition\BankTransactionDefinition;
use Drupal\xero\TypedData\Definition\BankTransferDefinition;
use Drupal\xero\TypedData\Definition\BrandingThemeDefinition;
use Drupal\xero\TypedData\Definition\ContactDefinition;
use Drupal\xero\TypedData\Definition\ContactGroupDefinition;
use Drupal\xero\TypedData\Definition\CreditDefinition;
use Drupal\xero\TypedData\Definition\CurrencyDefinition;
use Drupal\xero\TypedData\Definition\DetailDefinition;
use Drupal\xero\TypedData\Definition\EmployeeDefinition;
use Drupal\xero\TypedData\Definition\ExpenseDefinition;
use Drupal\xero\TypedData\Definition\InvoiceDefinition;
use Drupal\xero\TypedData\Definition\InvoiceReminderDefinition;
use Drupal\xero\TypedData\Definition\ItemDefinition;
use Drupal\xero\TypedData\Definition\JournalDefinition;
use Drupal\xero\TypedData\Definition\JournalLineDefinition;
use Drupal\xero\TypedData\Definition\LineItemDefinition;
use Drupal\xero\TypedData\Definition\LinkDefinition;
use Drupal\xero\TypedData\Definition\LinkedTransactionDefinition;
use Drupal\xero\TypedData\Definition\OrganisationDefinition;
use Drupal\xero\TypedData\Definition\PaymentDefinition;
use Drupal\xero\TypedData\Definition\PhoneDefinition;
use Drupal\xero\TypedData\Definition\ReceiptDefinition;
use Drupal\xero\TypedData\Definition\RepeatingInvoiceDefinition;
use Drupal\xero\TypedData\Definition\ScheduleDefinition;
use Drupal\xero\TypedData\Definition\TaxComponentDefinition;
use Drupal\xero\TypedData\Definition\TaxRateDefinition;
use Drupal\xero\TypedData\Definition\TrackingCategoryDefinition;
use Drupal\xero\TypedData\Definition\TrackingOptionDefinition;
use Drupal\xero\TypedData\Definition\UserDefinition;
use Drupal\xero\TypedData\Definition\XeroDefinitionInterface;
/**
* Tests typed data for xero data types.
*
* @group xero
*/
class XeroDataTypeTest extends KernelTestBase {
use TypedDataTrait;
use XeroGuidTrait;
/**
* {@inheritdoc}
*/
protected static $modules = ['user', 'serialization', 'xero'];
/**
* Tests each data type has correct data definition class.
*
* @param string $plugin_id
* The data type plugin id.
* @param string $expectedClass
* The expected class of the data type plugin.
* @param string $expectedDefinition
* The expected class of the data definition.
*
* @dataProvider dataDefinitionTestProvider
*/
public function testDataDefinition(string $plugin_id, string $expectedClass, string $expectedDefinition) {
$typedDataManager = $this->getTypedDataManager();
$configuration = [
'name' => NULL,
'parent' => NULL,
'data_definition' => $typedDataManager->createDataDefinition($plugin_id),
];
$item = $typedDataManager->createInstance($plugin_id, $configuration);
$this->assertInstanceOf($expectedClass, $item);
$this->assertInstanceOf($expectedDefinition, $item->getDataDefinition());
}
/**
* Tests instantiating a xero data type.
*
* @param string $plugin_id
* The data type plugin id.
* @param array<string,mixed> $values
* The data to set on the data type.
*
* @dataProvider dataTypeTestProvider
*/
public function testDataType(string $plugin_id, array $values) {
$typedDataManager = $this->getTypedDataManager();
$definition = $typedDataManager->createDataDefinition($plugin_id);
$item = $typedDataManager->create($definition, $values);
$this->assertEquals($values, $item->getValue());
}
/**
* Tests the data definition class for properties.
*
* @param string $plugin_id
* The data type plugin to instantiate.
* @param string $class
* The class to use for the data type.
* @param string $definitionClass
* The definition class to use for the data type. This is unused for this
* test.
*
* @dataProvider dataDefinitionTestProvider
*/
public function testDataDefinitionOfProperties(string $plugin_id, string $class, string $definitionClass): void {
$typedDataManager = $this->getTypedDataManager();
$configuration = [
'name' => NULL,
'parent' => NULL,
'data_definition' => $typedDataManager->createDataDefinition($plugin_id),
];
/** @var \Drupal\xero\TypedData\XeroItemInterface $item */
$item = $typedDataManager->createInstance($plugin_id, $configuration);
$testSkipped = TRUE;
foreach ($item->getDataDefinition()->getPropertyDefinitions() as $name => $propertyDefinition) {
if (str_starts_with($propertyDefinition->getDataType(), 'xero') && $propertyDefinition->getDataType() !== 'xero_item_list') {
$testSkipped = FALSE;
$this->assertInstanceOf(XeroDefinitionInterface::class, $propertyDefinition);
}
}
if ($testSkipped) {
$this->markTestSkipped('Data type does not include any non-list xero data types.');
}
}
/**
* Provides test cases for data definition test.
*
* @return array<int,mixed>
* An array of test case arguments.
*/
public static function dataDefinitionTestProvider() {
return [
['xero_account', Account::class, AccountDefinition::class],
['xero_address', Address::class, AddressDefinition::class],
[
'xero_bank_transaction',
BankTransaction::class,
BankTransactionDefinition::class,
],
[
'xero_bank_transfer',
BankTransfer::class,
BankTransferDefinition::class,
],
[
'xero_branding_theme',
BrandingTheme::class,
BrandingThemeDefinition::class,
],
['xero_contact', Contact::class, ContactDefinition::class],
[
'xero_contact_group',
ContactGroup::class,
ContactGroupDefinition::class,
],
['xero_credit_note', CreditNote::class, CreditDefinition::class],
['xero_currency', Currency::class, CurrencyDefinition::class],
['xero_detail', Detail::class, DetailDefinition::class],
['xero_employee', Employee::class, EmployeeDefinition::class],
['xero_expense', Expense::class, ExpenseDefinition::class],
['xero_invoice', Invoice::class, InvoiceDefinition::class],
[
'xero_invoice_reminder',
InvoiceReminder::class,
InvoiceReminderDefinition::class,
],
['xero_item', Item::class, ItemDefinition::class],
['xero_journal', Journal::class, JournalDefinition::class],
['xero_journal_line', JournalLine::class, JournalLineDefinition::class],
['xero_line_item', LineItem::class, LineItemDefinition::class],
['xero_link', Link::class, LinkDefinition::class],
[
'xero_linked_transaction',
LinkedTransaction::class,
LinkedTransactionDefinition::class,
],
[
'xero_organisation',
Organisation::class,
OrganisationDefinition::class,
],
['xero_payment', Payment::class, PaymentDefinition::class],
['xero_phone', Phone::class, PhoneDefinition::class],
['xero_receipt', Receipt::class, ReceiptDefinition::class],
[
'xero_repeating_invoice',
RepeatingInvoice::class,
RepeatingInvoiceDefinition::class,
],
['xero_schedule', Schedule::class, ScheduleDefinition::class],
[
'xero_tax_component',
TaxComponent::class,
TaxComponentDefinition::class,
],
['xero_tax_rate', TaxRate::class, TaxRateDefinition::class],
[
'xero_tracking',
TrackingCategory::class,
TrackingCategoryDefinition::class,
],
[
'xero_tracking_option',
TrackingOption::class,
TrackingOptionDefinition::class,
],
['xero_user', User::class, UserDefinition::class],
];
}
/**
* Provides test cases for data type test.
*
* @return array<string,mixed>
* An array of test case arguments.
*/
public static function dataTypeTestProvider(): array {
return [
'Contact (basic)' => [
'xero_contact',
[
'ContactID' => static::createGuid(),
'ContactNumber' => '00005',
'Name' => 'Pat',
'FirstName' => 'Pat',
'LastName' => 'Example',
],
],
'Contact (branded)' => [
'xero_contact',
[
'ContactID' => static::createGuid(),
'ContactNumber' => '00004',
'Name' => 'Sam',
'FirstName' => 'Sam',
'LastName' => 'Example',
'BrandingTheme' => [
'Name' => 'Very orange invoice!',
],
],
],
'Contact (all)' => [
'xero_contact',
[
'ContactID' => static::createGuid(),
'ContactNumber' => '00005',
'AccountNumber' => '200',
'Name' => 'Pat',
'FirstName' => 'Pat',
'LastName' => 'Example',
'EmailAddress' => 'pat@example.com',
'SkypeUserName' => 'pat@example.com',
'BankAccountDetails' => '41565456454',
'TaxNumber' => '415465456454',
'AccountsReceivableTaxType' => 'INPUT2',
'AccountsPayableTaxType' => 'OUTPUT2',
'Addresses' => [
[
'AddressType' => 'POBOX',
'AddressLine1' => 'P O Box 123',
'City' => 'Welington',
'PostalCode' => '6011',
'AttentionTo' => 'Pat',
],
],
'Phones' => [
[
'PhoneType' => 'DEFAULT',
'PhoneNumber' => '1111111',
'PhoneAreaCode' => '04',
'PhoneCountryCode' => '64',
],
],
'IsSupplier' => FALSE,
'IsCustomer' => TRUE,
'DefaultCurrency' => 'NZD',
],
],
];
}
}
