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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
140 changes: 140 additions & 0 deletions tests/unit/Abilities/AbilitiesHandlerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
<?php

namespace SkyVerge\WooCommerce\PluginFramework\v6_1_0\Tests\unit\Abilities;

use Exception;
use Generator;
use Mockery;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\AbilitiesHandler;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\Contracts\AbilitiesProviderContract;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\DataObjects\Ability;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\DataObjects\AbilityAnnotations;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\DataObjects\AbilityCategory;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Tests\TestCase;
use WP_Mock;

/**
* @coversDefaultClass \SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\AbilitiesHandler
*/
final class AbilitiesHandlerTest extends TestCase
{
/**
* @covers ::__construct
* @throws Exception
*/
public function testCanConstruct() : void
{
$provider = Mockery::mock(AbilitiesProviderContract::class);
$handler = new AbilitiesHandler($provider);

$this->assertSame($provider, $this->getInaccessiblePropertyValue($handler, 'abilitiesProvider'));
}

/**
* @covers ::addHooks
* @dataProvider providerCanAddHooks
*/
public function testCanAddHooks(bool $canUseApi) : void
{
$handler = $this->createPartialMock(AbilitiesHandler::class, ['canUseAbilitiesApi']);

$handler->expects($this->once())
->method('canUseAbilitiesApi')
->willReturn($canUseApi);

if ($canUseApi) {
WP_Mock::expectActionAdded('wp_abilities_api_categories_init', [$handler, 'handleCategoriesInit']);
WP_Mock::expectActionAdded('wp_abilities_api_init', [$handler, 'handleAbilitiesInit']);
} else {
WP_Mock::expectActionNotAdded('wp_abilities_api_categories_init', [$handler, 'handleCategoriesInit']);
WP_Mock::expectActionNotAdded('wp_abilities_api_init', [$handler, 'handleAbilitiesInit']);
}

$handler->addHooks();

$this->assertConditionsMet();
}

/** @see testCanAddHooks */
public function providerCanAddHooks() : Generator
{
yield 'can use api' => [true];
yield 'cannot use api' => [false];
}

/**
* @covers ::handleCategoriesInit
*/
public function testCanHandleCategoriesInit() : void
{
$category = new AbilityCategory('memberships', 'WooCommerce Memberships', 'Description');

$provider = Mockery::mock(AbilitiesProviderContract::class);
$provider->expects('getCategories')
->once()
->andReturn([$category]);

$handler = new AbilitiesHandler($provider);

WP_Mock::userFunction('wp_register_ability_category')
->once()
->with('memberships', [
'label' => 'WooCommerce Memberships',
'description' => 'Description',
'meta' => [],
]);

$handler->handleCategoriesInit();

$this->assertConditionsMet();
}

/**
* @covers ::handleAbilitiesInit
*/
public function testCanHandleAbilitiesInit(): void
{
$ability = new Ability(
'woocommerce-memberships/create-plan',
'Create Membership Plan',
'Create a new plan.',
'woocommerce-memberships',
fn() => true,
fn() => false,
['type' => 'integer'],
['type' => 'boolean'],
new AbilityAnnotations(false, false, false)
);

$provider = Mockery::mock(AbilitiesProviderContract::class);
$provider->expects('getAbilities')
->once()
->andReturn([$ability]);

$handler = new AbilitiesHandler($provider);

WP_Mock::userFunction('wp_register_ability')
->once()
->with('woocommerce-memberships/create-plan', [
'label' => $ability->label,
'description' => $ability->description,
'category' => $ability->category,
'execute_callback' => $ability->executeCallback,
'permission_callback' => $ability->permissionCallback,
'input_schema' => $ability->inputSchema,
'output_schema' => $ability->outputSchema,
'meta' => [
'show_in_rest' => true,
'annotations' => [
'readonly' => false,
'destructive' => false,
'idempotent' => false,
],
],
]);

$handler->handleAbilitiesInit();

$this->assertConditionsMet();
}
}
119 changes: 119 additions & 0 deletions tests/unit/Abilities/AbstractAbilitiesProviderTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
<?php

namespace SkyVerge\WooCommerce\PluginFramework\v6_1_0\Tests\unit\Abilities;

use Exception;
use Mockery;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\AbstractAbilitiesProvider;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\Contracts\MakesAbilityContract;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\DataObjects\Ability;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\SV_WC_Plugin;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Tests\TestCase;
use WP_Mock;

/**
* @coversDefaultClass \SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\AbstractAbilitiesProvider
*/
final class AbstractAbilitiesProviderTest extends TestCase
{
/**
* @covers ::__construct
* @throws Exception
*/
public function testCanConstruct() : void
{
$plugin = Mockery::mock(SV_WC_Plugin::class);
$concrete = new class($plugin) extends AbstractAbilitiesProvider {};

$this->assertSame($plugin, $this->getInaccessiblePropertyValue($concrete, 'plugin'));
}

/**
* @covers ::getCategories
* @throws Exception
*/
public function testCanGetCategories() : void
{
$this->assertSame(
[],
$this->invokeInaccessibleMethod(
$this->getMockForAbstractClass(AbstractAbilitiesProvider::class, [], '', false),
'getCategories'
)
);
}

/**
* @covers ::getAbilities
* @throws Exception
*/
public function testCanGetAbilities() : void
{
$abilityMaker = Mockery::mock(MakesAbilityContract::class);
$abilityMakerClassName = get_class($abilityMaker);

$abilityMaker->expects('makeAbility')
->once()
->andReturn($ability = Mockery::mock(Ability::class));

$abstractProvider = $this->getMockForAbstractClass(
AbstractAbilitiesProvider::class,
[],
'',
false,
false,
true,
['instantiateAbilityClass']
);

$this->setInaccessiblePropertyValue($abstractProvider, 'abilities', [$abilityMakerClassName]);

$abstractProvider->expects($this->once())
->method('instantiateAbilityClass')
->with(get_class($abilityMaker))
->willReturn($abilityMaker);

$this->assertSame(
[$ability],
$this->invokeInaccessibleMethod($abstractProvider, 'getAbilities')
);
}

/**
* @covers ::getAbilities
* @throws Exception
*/
public function testCanGetAbilitiesWithInvalidAbilityMaker() : void
{
$abilityMaker = new \stdClass();
$abilityMakerClassName = get_class($abilityMaker);

$abstractProvider = $this->getMockForAbstractClass(
AbstractAbilitiesProvider::class,
[],
'',
false,
false,
true,
['instantiateAbilityClass']
);

$this->setInaccessiblePropertyValue($abstractProvider, 'abilities', [$abilityMakerClassName]);

$abstractProvider->expects($this->never())
->method('instantiateAbilityClass');

WP_Mock::userFunction('wc_doing_it_wrong')
->once()
->with(
sprintf('%s::getAbilities', AbstractAbilitiesProvider::class),
'Ability class "stdClass" must implement '.MakesAbilityContract::class.'.',
'6.1.0'
);

$this->assertSame(
[],
$this->invokeInaccessibleMethod($abstractProvider, 'getAbilities')
);
}
}
41 changes: 41 additions & 0 deletions tests/unit/Abilities/DataObjects/AbilityAnnotationsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace SkyVerge\WooCommerce\PluginFramework\v6_1_0\Tests\unit\Abilities\DataObjects;

use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\DataObjects\AbilityAnnotations;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Tests\TestCase;

/**
* @coversDefaultClass \SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\DataObjects\AbilityAnnotations
*/
final class AbilityAnnotationsTest extends TestCase
{
/**
* @covers ::__construct
*/
public function testCanConstruct() : void
{
$abilityAnnotations = new AbilityAnnotations(true, true, true);

$this->assertTrue($abilityAnnotations->readonly);
$this->assertTrue($abilityAnnotations->destructive);
$this->assertTrue($abilityAnnotations->idempotent);
}

/**
* @covers ::toArray
*/
public function testCanConvertToArray() : void
{
$abilityAnnotations = new AbilityAnnotations(true, true, true);

$this->assertSame(
[
'readonly' => true,
'destructive' => true,
'idempotent' => true,
],
$abilityAnnotations->toArray()
);
}
}
42 changes: 42 additions & 0 deletions tests/unit/Abilities/DataObjects/AbilityCategoryTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace SkyVerge\WooCommerce\PluginFramework\v6_1_0\Tests\unit\Abilities\DataObjects;

use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\DataObjects\AbilityCategory;
use SkyVerge\WooCommerce\PluginFramework\v6_1_0\Tests\TestCase;

/**
* @coversDefaultClass \SkyVerge\WooCommerce\PluginFramework\v6_1_0\Abilities\DataObjects\AbilityCategory
*/
final class AbilityCategoryTest extends TestCase
{
/**
* @covers ::__construct
*/
public function testCanConstruct() : void
{
$category = new AbilityCategory('ability-category', 'Ability Category', 'Description...', ['key' => 'value']);

$this->assertSame('ability-category', $category->slug);
$this->assertSame('Ability Category', $category->label);
$this->assertSame('Description...', $category->description);
$this->assertSame(['key' => 'value'], $category->meta);
}

/**
* @covers ::toArray
*/
public function testCanConvertToArray() : void
{
$category = new AbilityCategory('ability-category', 'Ability Category', 'Description...', ['key' => 'value']);

$this->assertSame(
[
'label' => $category->label,
'description' => $category->description,
'meta' => $category->meta,
],
$category->toArray()
);
}
}
Loading
Loading