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

Filter by extension

Filter by extension

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

use PHPUnit\Framework\TestCase;

final class ActivationTest extends TestCase {
protected function setUp(): void {
spiff_test_reset();
}

private function addAdmin() {
$GLOBALS['spiff_test_users'][] = (object) array(
'ID' => 7,
'data' => (object) array('user_email' => 'admin@shop.test'),
);
$GLOBALS['spiff_test_user_meta'][7] = array(
'billing_phone' => '0400 000 000',
'first_name' => 'Jamie',
'last_name' => 'Smith',
);
}

public function testFirstActivationNotifiesSpiff() {
$this->addAdmin();

spiff_activation_hook();

$this->assertCount(1, $GLOBALS['spiff_test_requests']);
$request = $GLOBALS['spiff_test_requests'][0];
$this->assertSame(SPIFF_TEST_AP_BASE . '/graphql', $request['url']);
$body = json_decode($request['args']['body'], true);
$this->assertSame('InstallNotify', $body['operationName']);
$this->assertSame(array(
'type' => 'WooCommerce',
'shopName' => 'https://shop.test',
'owner' => 'Jamie Smith',
'email' => 'admin@shop.test',
'phone' => '0400 000 000',
), $body['variables']['input']);
}

public function testFirstActivationIsRecorded() {
$this->addAdmin();

spiff_activation_hook();

$this->assertSame('1', get_option('spiff_plugin_was_activated'));
}

public function testLaterActivationsDoNotNotifySpiff() {
$this->addAdmin();
$GLOBALS['spiff_test_options']['spiff_plugin_was_activated'] = '1';

spiff_activation_hook();

$this->assertCount(0, $GLOBALS['spiff_test_requests']);
}

public function testActivationWithoutAdminsDoesNotNotifySpiff() {
spiff_activation_hook();

$this->assertCount(0, $GLOBALS['spiff_test_requests']);
$this->assertSame('1', get_option('spiff_plugin_was_activated'));
}
}
81 changes: 81 additions & 0 deletions tests/AdminTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
<?php

use PHPUnit\Framework\TestCase;

final class AdminTest extends TestCase {
protected function setUp(): void {
spiff_test_reset();
}

public function testCreatesAdminMenuPage() {
spiff_create_admin_menu();

$this->assertSame(array(array(
'page_title' => 'Spiff Connect',
'menu_title' => 'Spiff Connect',
'capability' => 'administrator',
'menu_slug' => 'spiff-connect',
'callback' => 'spiff_admin_menu_html',
)), $GLOBALS['spiff_test_menu_pages']);
$this->assertTrue(spiff_test_has_action('admin_init', 'spiff_register_admin_settings'));
}

public function testRegistersSettings() {
spiff_register_admin_settings();

$this->assertSame(array(
'spiff_application_key',
'spiff_infrastructure',
'spiff_show_customer_selections_in_cart',
'spiff_show_preview_images_in_cart',
'spiff_non_bulk_text',
'spiff_font_size',
'spiff_font_weight',
'spiff_text_color',
'spiff_background_color',
'spiff_width',
'spiff_height',
'spiff_customer_portal_button_text',
'spiff_customer_portal_button_font_size',
'spiff_customer_portal_button_font_weight',
'spiff_customer_portal_button_text_color',
'spiff_customer_portal_button_background_color',
'spiff_customer_portal_button_width',
'spiff_customer_portal_button_height',
), $GLOBALS['spiff_test_settings']['spiff-settings-group']);
}

public function testAddsProductFields() {
spiff_create_admin_product_fields();

$fields = $GLOBALS['spiff_test_product_fields'];
$this->assertCount(2, $fields);
$this->assertSame('checkbox', $fields[0]['type']);
$this->assertSame('spiff_enabled', $fields[0]['id']);
$this->assertSame('text', $fields[1]['type']);
$this->assertSame('spiff_integration_product_id', $fields[1]['id']);
}

public function testSavesEnabledProductFields() {
$product = new Spiff_Test_Product(42);
$GLOBALS['spiff_test_products'][42] = $product;
$_POST = array('spiff_enabled' => 'yes', 'spiff_integration_product_id' => ' integration-product-1 ');

spiff_save_admin_product_fields(42);

$this->assertSame('yes', $product->meta['spiff_enabled']);
$this->assertSame('integration-product-1', $product->meta['spiff_integration_product_id']);
$this->assertTrue($product->saved);
}

public function testSavesDisabledProductFieldsWhenCheckboxIsUnticked() {
$product = new Spiff_Test_Product(42, array('spiff_enabled' => 'yes'));
$GLOBALS['spiff_test_products'][42] = $product;
$_POST = array('spiff_integration_product_id' => 'integration-product-1');

spiff_save_admin_product_fields(42);

$this->assertSame('no', $product->meta['spiff_enabled']);
$this->assertTrue($product->saved);
}
}
191 changes: 191 additions & 0 deletions tests/CartTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
<?php

use PHPUnit\Framework\TestCase;

final class CartTest extends TestCase {
protected function setUp(): void {
spiff_test_reset();
$GLOBALS['spiff_test_options']['spiff_application_key'] = 'test-application-key';
}

private function queueTransaction() {
spiff_test_queue_response(array('data' => array('transactions' => array(array(
'priceModifierTotal' => 250,
'product' => array(
'basePrice' => 1000,
'integrationProducts' => array(array('id' => 'integration-product-1')),
),
)))));
}

private function postCartItemDetails($details) {
// WordPress adds slashes to request data, which the plugin strips.
$_POST['spiff_create_cart_item_details'] = addslashes(json_encode($details));
}

// Adding designs to the cart.

public function testAddsDesignToCart() {
$this->queueTransaction();
$this->postCartItemDetails(array(
'transactionId' => 'transaction-1',
'wooProductId' => '42',
'exportedData' => array('Name' => array('value' => 'Jamie')),
));

spiff_create_cart_item();

$this->assertSame(array(array(
'product_id' => '42',
'quantity' => 1,
'variation_id' => '',
'variation' => '',
'cart_item_data' => array(
'spiff_exported_data' => array('Name' => 'Jamie'),
'spiff_transaction_id' => 'transaction-1',
'spiff_item_price' => 12.5,
),
)), $GLOBALS['woocommerce']->cart->added);
$this->assertSame(1, $GLOBALS['spiff_test_wp_die_calls']);
}

public function testRequestsTransactionFromSpiff() {
$this->queueTransaction();
$this->postCartItemDetails(array(
'transactionId' => 'transaction-1',
'wooProductId' => '42',
'exportedData' => array(),
));

spiff_create_cart_item();

$request = $GLOBALS['spiff_test_requests'][0];
$this->assertSame(SPIFF_TEST_AP_BASE . '/graphql', $request['url']);
$this->assertSame('test-application-key', $request['args']['headers']['X-Application-Key']);
$this->assertStringContainsString('transaction-1', json_decode($request['args']['body'], true)['query']);
}

public function testFindsProductFromIntegrationProductWhenProductIdIsMissing() {
$GLOBALS['spiff_test_products'] = array(
41 => new Spiff_Test_Product(41, array('spiff_integration_product_id' => 'integration-product-other')),
42 => new Spiff_Test_Product(42, array('spiff_integration_product_id' => 'integration-product-1')),
);
$this->queueTransaction();
$this->postCartItemDetails(array(
'transactionId' => 'transaction-1',
'exportedData' => array(),
));

spiff_create_cart_item();

$this->assertSame('42', $GLOBALS['woocommerce']->cart->added[0]['product_id']);
}

public function testSanitisesCustomerSelections() {
$this->queueTransaction();
$this->postCartItemDetails(array(
'transactionId' => 'transaction-1',
'wooProductId' => '42',
'exportedData' => array('<b>Name</b>' => array('value' => ' <i>Jamie</i> ')),
));

spiff_create_cart_item();

$this->assertSame(
array('Name' => 'Jamie'),
$GLOBALS['woocommerce']->cart->added[0]['cart_item_data']['spiff_exported_data']
);
}

public function testDoesNothingWithoutCartItemDetails() {
spiff_create_cart_item();

$this->assertCount(0, $GLOBALS['spiff_test_requests']);
$this->assertCount(0, $GLOBALS['woocommerce']->cart->added);
$this->assertSame(1, $GLOBALS['spiff_test_wp_die_calls']);
}

// Cart prices.

public function testSetsPriceOfSpiffItems() {
$spiff_product = new Spiff_Test_Product(42);
$other_product = new Spiff_Test_Product(43);
$GLOBALS['woocommerce']->cart->items = array(
array('data' => $spiff_product, 'spiff_item_price' => 12.5),
array('data' => $other_product),
);

spiff_handle_cart_item_price($GLOBALS['woocommerce']->cart);

$this->assertSame(12.5, $spiff_product->price);
$this->assertNull($other_product->price);
}

// Customer selections in cart.

public function testShowsCustomerSelectionsInCart() {
$cart_data = array(array('name' => 'Colour', 'value' => 'Red'));
$cart_item = array('spiff_exported_data' => array('Name' => 'Jamie', 'Message' => '<b>Hi</b>'));

$this->assertSame(array(
array('name' => 'Colour', 'value' => 'Red'),
array('name' => 'Name', 'value' => 'Jamie'),
array('name' => 'Message', 'value' => '&lt;b&gt;Hi&lt;/b&gt;'),
), spiff_show_metadata_in_cart($cart_data, $cart_item));
}

// Preview images in cart.

public function testShowsPreviewImageForSpiffItems() {
spiff_test_queue_response(array('data' => array('transactions' => array(array(
'previewImageLink' => 'https://images.spiff.test/preview.png',
)))));

$image = spiff_show_preview_image_in_cart('<img src="product.png" />', array('spiff_transaction_id' => 'transaction-1'), 'key');

$this->assertSame('<img src="https://images.spiff.test/preview.png" alt="preview" />', $image);
$body = json_decode($GLOBALS['spiff_test_requests'][0]['args']['body'], true);
$this->assertSame(array('ids' => array('transaction-1')), $body['variables']);
}

public function testKeepsProductImageWhenSpiffHasNoPreview() {
spiff_test_queue_response(array('data' => array('transactions' => array(array('previewImageLink' => null)))));

$image = spiff_show_preview_image_in_cart('<img src="product.png" />', array('spiff_transaction_id' => 'transaction-1'), 'key');

$this->assertSame('<img src="product.png" />', $image);
}

public function testKeepsProductImageWhenSpiffRequestFails() {
spiff_test_queue_response(array('errors' => array(array('message' => 'Unauthorised'))), 401);

$image = spiff_show_preview_image_in_cart('<img src="product.png" />', array('spiff_transaction_id' => 'transaction-1'), 'key');

$this->assertSame('<img src="product.png" />', $image);
}

public function testKeepsProductImageForOtherItems() {
$image = spiff_show_preview_image_in_cart('<img src="product.png" />', array(), 'key');

$this->assertSame('<img src="product.png" />', $image);
$this->assertCount(0, $GLOBALS['spiff_test_requests']);
}

// Checkout.

public function testCopiesTransactionIdToOrderItem() {
$order_item = new Spiff_Test_Order_Item(array(), 1);

spiff_add_cart_item_attributes_to_order_item($order_item, 'key', array('spiff_transaction_id' => 'transaction-1'), null);

$this->assertSame('transaction-1', $order_item->get_meta('spiff_transaction_id'));
}

public function testLeavesOtherOrderItemsAlone() {
$order_item = new Spiff_Test_Order_Item(array(), 1);

spiff_add_cart_item_attributes_to_order_item($order_item, 'key', array(), null);

$this->assertSame(array(), $order_item->meta);
}
}
Loading
Loading