How to assert the current URL? - selenium

I'm unittesting my Yii application with PHPUnit and Selenium-server.
Code:
class StartSurveyRedirectTest extends WebTestCase
{
public $fixtures=array(
'sessions'=>'SurveySession',
'surveys' => 'Survey',
);
public function testActive() {
$survey = $this->surveys('survey_active');
$user_id = 1;
$imid = 'nl1234-9876';
$this->open('veldwerk/survey/redirect?survey_id=' . $survey->survey_id .
'&user_id=' . $user_id .
'&imid=' . $imid .
'&' . $survey->security_parameter_name . '=' . $survey->getSecurityParameterValue()
);
//assert if redirected
$this->assertNotEquals($this->url(),TEST_BASE_URL .
'veldwerk/survey/redirect?survey_id=' . $survey->survey_id .
'&user_id=' . $user_id .
'&imid=' . $imid .
'&' . $survey->security_parameter_name . '=' . $survey->getSecurityParameterValue()
);
}
}
The result when I start the test:
There was 1 error:
1) StartSurveyRedirectTest::testActive
Method url not defined.
D:\workspace\Pi\framework\test\CWebTestCase.php:63
D:\workspace\Pi\protected\tests\functional\StartSurveyRedirectTest.php:27
D:\workspace\Pi\protected\tests\functional\StartSurveyRedirectTest.php:27
Caused by
BadMethodCallException: Method url not defined.
D:\workspace\Pi\framework\test\CWebTestCase.php:63
D:\workspace\Pi\protected\tests\functional\StartSurveyRedirectTest.php:27
D:\workspace\Pi\protected\tests\functional\StartSurveyRedirectTest.php:27
So what I really want to test is if the user has been redirected. I thought the easiest way was to check the URL but it turns out it doesn't work? While in the selenium docs and PHPUnit docs says it can..
Does the Yii framework does not support this? Or am I doing something wrong?

Instead of using url as a method, try it as a property:
$this->url
I'm at work now and am able to check this out. I think the proper code for PHPUnit with Selenium is:
$driver->getCurrentPageUrl();
So it is a method from the driver instance.

Turns out PHPUnit_Extensions_SeleniumTestCase_Driver is an ancestor class of WebTestCase the Yii class I extend in my test.
PHPUnit_Extensions_SeleniumTestCase_Driver implements the method getLocation() which holds the current browser url. This allows me to use $this->getLocation()
SeleniumTestCase_Driver class reference
The result of my code:
//assert if redirected
$this->assertNotEquals($this->getLocation(),TEST_BASE_URL .
'veldwerk/survey/redirect?survey_id=' . $survey->survey_id .
'&user_id=' . $user_id .
'&imid=' . $imid .
'&' . $survey->security_parameter_name . '=' . $survey->getSecurityParameterValue()
);

Related

How to retrieve log from graylog over API

How can I search logs from a graylog server with PHP?
Assume the graylog servers is https://host.td/api/search/universal/absolute
This solution is implemented in PHP:
$url = 'https://host.td/api/search/universal/absolute'
. '?query=' . urlencode('field:value') //query which you would also perform on UI
. '&from=' . urlencode(Carbon::createFromTimestamp(0)) // min timestamp so we get all logs
. '&to=' . urlencode(Carbon::createFromTimestamp(NumberUtils::MAX_32_BIT_INT)) // max timestamp so we get all logs
. '&limit=' . $this->limit //how many results do we want?
. '&fields=' . urlencode('field1,field2,field3') //which fields do we want?
. '&filter=' . urlencode('streams:<stream_id>') //OPTIONAL: only search in this stream
. '&sort=' . urlencode('field:desc') //sort result
. '&decorate=false'; //decorate parameter
$res = (new Client())->get($url, [
// generate a token on graylog UI;
// we use basic auth, username=the token; password: hard coded string 'token'
'auth' => ['<token_value>', 'token'],
'headers' => ['Accept' => 'application/json'] //we want a json result
]);
$json = \GuzzleHttp\json_decode($res->getBody());
If you want to sort by a timestamp you provided, don't call it timestamp since in this case graylog's timestamp is used, not yours. I ended up using a prefix on every field I am storing.

How to pass translations from a module to a smarty template in prestashop?

I'm building a module, and have somethins like this:
$custom_menu = '<ul class="main-menu custom-menu">'.
'<li class="collections">' . $this->l("Collections") . $this->get_collections_menu($collections) . '</li>'.
'<li class="styles">' . $this->l("Styles") . $this->get_styles_menu($collections) . '</li>'.
'<li class="pearls">' . $this->l("Pearls") . $this->get_pearls_menu($collections_category_link) . '</li>'.
'<li class="prices">' . $this->l("Prices") . $this->get_prices_menu($collections_category_link) . '</li>'.
'<li class="categories hide-for-large-up">' . $this->l("Categories") . $this->get_categories_menu() . '</li>'.
'</ul>';
$this->context->smarty->assign('custom_menu', $custom_menu);
It all goes fine, menu will show up. My problem is with translations: I cannot find them in backoffice to edit. What's wrong with this code?
Ok I've just found the solution: strings MUST be delimited with single quotes, not double quotes. So instead of this:
'<li class="collections">' . $this->l("Collections") . $this->get_collections_menu($collections) . '</li>'
use this:
'<li class="collections">' . $this->l('Collections') . $this->get_collections_menu($collections) . '</li>'
In other words: $this->('your string') is fine.
Then you'll find the fields to translate on the backoffice translations panel, under the 'module translations' translation type.
And no matter where in the module you'll place the l() functions. Constructor, hooks, string concatenations, everywhere is fine.
For translate php
$this->l('Text')
For translate tpl
{l s='Text' mod='Name Module'}
In your case
'<li class="collections">{l s='Collections' mod='Name Module'}'

TYPO3 - Add flexform to my own extension

I am building my own extension.
I have found this page about adding Flexform to the Extension
https://gist.github.com/alrnz/c0f00b196d378f5b9150
And in my ext_tables.php i have this:
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
$_EXTKEY,
'Xlsxtotables',
'XLSX to tables'
);
// Include flex forms
$pluginSignature = str_replace('_', '', $_EXTKEY) . '_' . 'xlsxtotables'; // from registerPlugin(...)
$TCA['tt_content']['types']['list']['subtypes_addlist'] [$pluginSignature] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
$pluginSignature,
'FILE:EXT:' . $_EXTKEY . '/Configuration/FlexForms/flexform_xlsxtotables.xml'
);
I know that the XML-file is in the right place, but I do not get anyting from it in TYPO3 backend.
Any suggestions?
Try replace
$pluginSignature = str_replace('_', '', $_EXTKEY) . '_' . 'xlsxtotables';
by
$extensionName = strtolower(\TYPO3\CMS\Core\Utility\GeneralUtility::underscoredToUpperCamelCase($_EXTKEY));
$pluginSignature = $extensionName.'_'.'xlsxtotables';
And dont forget to empty your general cache before you see a change with your flexform.
You can try below code in ext_tables.php file
$pluginName = 'Pi1'; // Give Your Plugin Nmae
$pluginSignature = preg_replace('/[^a-z0-9]/', '', strtolower($_EXTKEY)) . '_' . strtolower($pluginName);
// FlexForm configuration
$TCA['tt_content']['types']['list']['subtypes_addlist'][$pluginSignature] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
$pluginSignature,
'FILE:EXT:' . $_EXTKEY . '/Configuration/FlexForms/flexformname.xml'
);
For Adding Flexforms in One or More Front-end plugins you can use Below code in ext_tables.php
$extensionName = \TYPO3\CMS\Core\Utility\GeneralUtility::underscoredToUpperCamelCase($_EXTKEY);
$frontendpluginName = 'xxx'; //Your Front-end Plugin Name
$pluginSignature = strtolower($extensionName) . '_'.strtolower($frontendpluginName);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$pluginSignature] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue($pluginSignature, 'FILE:EXT:' . $_EXTKEY . '/Configuration/FlexForms/xyz.xml');

module overriding in zen cart

I am new to Zen Cart and currently working on a project which has custom template. I am now stuck on override of module file new_products.php !! how to override new_products.php ? I want to change HTML in it. how can I do it ? I have made changes in new_products.php itself. I know it is not right way to do it, but I am confused where do I make changes/override module file ?
Here is the code where I made changes in main new_products.php file
while (!$new_products->EOF) {
$products_price = zen_get_products_display_price($new_products->fields['products_id']);
if (!isset($productsInCategory[$new_products->fields['products_id']])) $productsInCategory[$new_products->fields['products_id']] = zen_get_generated_category_path_rev($new_products->fields['master_categories_id']);
$list_box_contents[$row][$col] = array('params' => 'class="centerBoxContentsNew centeredContent back"' . ' ' . 'style="width:' . $col_width . '%;"',
'text' => (($new_products->fields['products_image'] == '' and PRODUCTS_IMAGE_NO_IMAGE_STATUS == 0) ? '' : '<center><h2>'.$new_products->fields['products_name'].'</h2>' . zen_image(DIR_WS_IMAGES . $new_products->fields['products_image'], $new_products->fields['products_name'], IMAGE_PRODUCT_NEW_WIDTH, IMAGE_PRODUCT_NEW_HEIGHT) . '</center>') . '<h3>' . $products_price.'</h3><p>'.$new_products->fields['products_description'].'</p>
<div class="button black"><a href="' . zen_href_link(zen_get_info_page($new_products->fields['products_id']), 'cPath=' . $productsInCategory[$new_products->fields['products_id']] . '&products_id=' . $new_products->fields['products_id']) . '">Add To Cart' .'</div>');
$col ++;
if ($col > (SHOW_PRODUCT_INFO_COLUMNS_NEW_PRODUCTS - 1)) {
$col = 0;
$row ++;
}
$new_products->MoveNextRandom();}
It's perfectly fine to modify new_products.php, but first copy
includes/modules/new_products.php
to
includes/modules/YOUR_TEMPLATE/new_products.php
(where YOUR_TEMPLATE is the name of your custom template).
Then make changes in the file
includes/modules/YOUR_TEMPLATE/new_products.php
You can determine your template name by going to admin->tools->template selection.
If you don't know how to create a custom template in Zen Cart, read this:
http://www.zen-cart.com/content.php?180

Display images from protected folder

I have a protected folder within Yii and I'm looking to display some of those images within the site. I've tried the following code and it works within the site/index controller in that it returns just the image I wanted.
However when I tried to separate the code it didn't work. Any help is appreciated.
Model
public function getImage() // will take file identifier as #param
{
$imageID = '2562584569'; // will eventually be dynamically assigned
$image = Images::model()->find('tmp_name=:id', array('id' => $imageID));
$dest = Yii::getPathOfAlias('application.uploads');
$file = $dest .'/' . $image->tmp_name . '.' . $image->extension;
if(file_exists($file)){
ob_clean();
header('Content-Type:' . $image->logo_type);
readfile($file);
exit;
}
}
And in the view
CHtml::link('<img src="' . Yii::app()->request->baseUrl .'/images/image" />', array('product/index', 'id'=>$data['product_id'], 'slug'=> $data['product_slug']));
Thanks
Jonnny
"protected" folder are not accessible from the client browser. This prevents people to have access to important files, like your source code.
If you want to store images inside "protected" and want them to be accessible, you need to publish them using CAssetManager.
Usage is something like:
$path = Yii::app()->basePath.'/path-inside-protected';
$yourImageUrl = Yii::app()->assetManager->publish($path);
Yii will then use the file as an asset, coping it to the "assets" folder, sibling to "protected". After that, you can just use the url returned on your HTML.
<img src="<?php echo $yourImageUrl ?>">
I went about it like this
CHtml::link('<img src="' . $this->createUrl('/images/image', array('data'=>$data['data'])) . '" />', array('product/index', 'id'=>$data['product_id'], 'slug'=> $data['product_slug']));
Model
public function actionImage($data)
{
$image = Images::model()->find('tmp_name=:data', array('id' => $data));
$dest = Yii::getPathOfAlias('application.uploads');
$file = $dest .'/' . $image->tmp_name . '.' . $image->extension;
if(file_exists($file)){
ob_clean();
header('Content-Type:' . $image->logo_type);
readfile($file);
exit;
}
}
Thanks for all help