<?php
/**
* Integration test for OnePageCheckout
*
* @author Fabian Schmengler <fschmengler@sgh-it.eu>
* @copyright SGH informationstechnologie UGmbH 2012
* @package SGH\Common
* @subpackage Test
*
*/
class SGH_Common_Test_Controller_Checkout_OnepageController
extends EcomDev_PHPUnit_Test_Case_Controller
{
protected function setUp()
{
parent::setUp();
/*
* uncomment if test system has no mail capability
*/
//$this->_replaceMailerModels();
}
protected function _replaceMailerModels()
{
$this->replaceByMock(
'model', 'core/email_template',
$this->_mockMailer('core/email_template')
);
$this->replaceByMock(
'model', 'core/email', $this->_mockMailer('core/email')
);
}
/**
* Returns mock for given mailer model
*
* @param string $model class alias
* @return PHPUnit_Framework_MockObject_MockObject
*/
protected function _mockMailer($model)
{
return $this->getModelMock(
$model, array('send', 'sendTransactional')
);
}
protected function tearDown()
{
$this->_deleteOrders();
parent::tearDown();
}
/**
* Deletes any created order
*
* @return void
*/
protected function _deleteOrders()
{
Mage::register('isSecureArea', true);
/* @var $orders Mage_Sales_Model_Mysql4_Order_Collection */
$orders = Mage::getModel('sales/order')->getCollection()->load();
$orders->walk('delete');
}
/**
* @author Alistair Stead
* @author Fabian Schmengler (rewritten for EcomDev PHPUnit)
* @test
* @loadFixture
*/
public function magentoCheckoutIntegrationTest()
{
$this->setCurrentStore('default');
// Add the product to the basket
$this->getRequest()->setMethod('POST')
->setPost(
array(
'product' => '1',
'related_product' => '',
'qty' => '1'
)
);
// Set an initial cookie so that the Magento cookie validation passes
$this->getRequest()->setCookie('mage-test', true);
$this->dispatch('checkout/cart/add');
$this->assertResponseHttpCode('302', '/checkout/cart/add/ has not redirected to the cart');
$this->assertRedirectToUrlRegExp("/^.*checkout.*$/", 'We are not directed to the checkout as expected');
$this->reset();
$this->_fixCheckout();
$this->_debugCheckout();
// Set the checkout as guest
$this->getRequest()->setMethod('POST')
->setPost(
array(
'method' => 'guest'
)
);
$this->dispatch('checkout/onepage/saveMethod');
$this->assertResponseHttpCode('200', '/checkout/onepage/saveMethod/ has not responded as expected');
$this->reset();
// Save billing address
$this->getRequest()->setMethod('POST')
->setPost(
array(
'billing' => array(
'address_id' => '',
'firstname' => 'Authorize',
'lastname' => 'Capture',
'company' => '',
'email' => 'user@mage-test.co.uk',
'street' => array('Flat 14b', 'Baker Street'),
'city' => 'London',
'region_id' => '',
'postcode' => 'W1B OW3',
'country_id' => 'GB',
'telephone' => '+44 1234 123456',
'fax' => '+44 1234 123456',
'customer_password' => '',
'confirm_password' => '',
'save_in_address_book' => '1',
'use_for_shipping' => '1'
)
)
);
$this->dispatch('checkout/onepage/saveBilling');
$this->assertResponseHttpCode('200', '/checkout/onepage/saveBilling/ has not responded as expected');
$this->reset();
// Set shipping method
$this->getRequest()->setMethod('POST')
->setPost(
array(
'shipping_method' => 'flatrate_flatrate'
)
);
$this->dispatch('checkout/onepage/saveShippingMethod');
$this->assertResponseHttpCode('200', '/checkout/onepage/saveShippingMethod/ has not responded as expected');
$this->reset();
// Save payment
$this->getRequest()->setMethod('POST')
->setPost(
array(
'payment' => array(
'method' => 'checkmo'
)
)
);
$this->dispatch('checkout/onepage/savePayment');
$this->assertResponseHttpCode('200', '/checkout/onepage/savePayment/ has not responded as expected');
$this->reset();
// Save order
$this->getRequest()->setMethod('POST')
->setPost(
array(
'payment' => array(
'method' => 'checkmo'
)
)
);
$this->dispatch('checkout/onepage/saveOrder');
$this->assertResponseHttpCode('200', '/checkout/onepage/saveOrder/ has not responded as expected');
// Decode the JSON response so that we can evaluate the success
$data = json_decode($this->getResponse()->getOutputBody(), true);
$this->assertTrue(
$data['success'],
'Unexpected status expected result: ' .
array_key_exists('error_messages', $data)
? $data['error_messages'] : ' - '
);
}
/*
* 403 Session Expired: Root Cause Analysis
*/
protected function _debugCheckout()
{
/* @var $opc Mage_Checkout_Model_Type_Onepage */
$opc = Mage::getSingleton('checkout/type_onepage');
$this->assertTrue(
$opc->getQuote()->hasItems(),
'DEBUG: hasItems()'
);
$this->assertEquals(
false, $opc->getQuote()->getHasError(),
'DEBUG: hasError'
);
$this->assertEquals(
false, $opc->getQuote()->getIsMultiShipping(),
'DEBUG: isMultiShipping'
);
$this->assertEquals(
false, Mage::getSingleton('checkout/session')->getCartWasUpdated(),
'DEBUG: cartWasUpdated'
);
/*
* payment method
*/
$check = (string) $this->app()->getConfig()->getNode(
'payment/checkmo/active', 'store', 'default'
);
$this->assertEquals('1', $check, 'DEBUG: Check / Money Order is active');
}
/*
* solved :-)
*/
protected function _fixCheckout()
{
Mage::getSingleton('checkout/session')->setCartWasUpdated(false);
}
}