If you want some dummy html content for test purpose like form, paragraph or list content then you can use content from http://html-ipsum.com/
code prettify
Thursday, 31 March 2016
Sunday, 27 March 2016
Testing APIs in CodeIgniter 2.x using phpunit and Guzzle Http client
Sometimes we have apis implemented in our application and there are different levels at which these can be tested.
1. Unit tested at model level to check the logic is working fine
2. Tested at API call level to ascertain whether all the apis as expected are working and are returning data as expected.
Today, we will be learning how to test APIs in CodeIgniter 2.x version using phpunit and Guzzle Http client.
Basically Guzzle Http client is a client used to make http client requests.
Ref: https://github.com/guzzle/guzzle
"Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and trivial to integrate with web services."
We will basically be creating an API for a blog so as to get blog posts and add blog post. When testing APIs, we are basically testing the output format, expected fields in the output and their data type and value if needed.
Sample code can be found at git repository here: https://github.com/satejkumar/CodeIgniter_API_Testing
We are using composer to install the dependencies: phpunit and Guzzle http client.
So download the latest CodeIgniter 2.x version and create a composer.json file with the following content:
{
"require": {
"guzzlehttp/guzzle": "^6.1",
"phpunit/phpunit": "*",
"phpunit/php-invoker": "*",
"phpunit/dbunit": "*"
}
}
and then install the dependencies using the below command:
$ composer install
Then we create our test file inside application/tests/ folder called PostsTest.php
All the dependencies are included by the autoload file.
require('../../vendor/autoload.php');
Before doing each test case, we setup the Guzzle Http client and set the base uri of the API request as below inside setUp() function which is called before each test function call.
protected function setUp()
{
$this->client = new GuzzleHttp\Client([
'base_uri' => 'http://localhost/'
]);
}
One function is to test get post API request, so we are making a get request to url http://localhost/posts/index/1 to get the first post and are expecting a json content and the json content should have some fields and should have an id value of 1.
public function testGet_ValidInput_PostObject()
{
$response = $this->client->get('posts/index/1');
$this->assertEquals(200, $response->getStatusCode());
$data = json_decode($response->getBody(), true);
$this->assertArrayHasKey('id', $data);
$this->assertArrayHasKey('title', $data);
$this->assertArrayHasKey('content', $data);
$this->assertArrayHasKey('author_id', $data);
$this->assertArrayHasKey('emails_sent', $data);
$this->assertArrayHasKey('created_at', $data);
$this->assertArrayHasKey('updated_at', $data);
$this->assertEquals(1, $data['id']);
}
So we are using assertArrayHasKey() function to check if a particular field is present in the data set and assertEquals() to check for value.
Another function is to test POST request to create a new blog post.
public function testPost_NewBlog_Post()
{
$response = $this->client->post('posts/index', [
'form_params' => [
'title' => 'My Random Post',
'content' => 'Content',
'author_id' => 1
]
]);
$this->assertEquals(200, $response->getStatusCode());
$data = json_decode($response->getBody(), true);
$this->assertGreaterThanOrEqual(1, $data['id']);
}
In the above function we are creating a post request to the url http://localhost/posts/index with post parameters and are then expecting a 200 status code output and a json content with a field "id" which should have an integer value greater than or equal to 1.
Now that we are done with the tests, we can run them from the project root directory using below command:
$ ./vendor/bin/phpunit application/tests/
Basically phpunit and Guzzle Http client help us in making requests and verify responses thus enabling us to test APIs.
Ref: https://ole.michelsen.dk/blog/testing-your-api-with-phpunit.html
Excerpt: "Remember it's just as important to test failing/edge cases as testing when things go well. Also you should run these tests against an isolated testing environment if they modify your data."
1. Unit tested at model level to check the logic is working fine
2. Tested at API call level to ascertain whether all the apis as expected are working and are returning data as expected.
Today, we will be learning how to test APIs in CodeIgniter 2.x version using phpunit and Guzzle Http client.
Basically Guzzle Http client is a client used to make http client requests.
Ref: https://github.com/guzzle/guzzle
"Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and trivial to integrate with web services."
We will basically be creating an API for a blog so as to get blog posts and add blog post. When testing APIs, we are basically testing the output format, expected fields in the output and their data type and value if needed.
Sample code can be found at git repository here: https://github.com/satejkumar/CodeIgniter_API_Testing
We are using composer to install the dependencies: phpunit and Guzzle http client.
So download the latest CodeIgniter 2.x version and create a composer.json file with the following content:
{
"require": {
"guzzlehttp/guzzle": "^6.1",
"phpunit/phpunit": "*",
"phpunit/php-invoker": "*",
"phpunit/dbunit": "*"
}
}
and then install the dependencies using the below command:
$ composer install
Then we create our test file inside application/tests/ folder called PostsTest.php
All the dependencies are included by the autoload file.
require('../../vendor/autoload.php');
Before doing each test case, we setup the Guzzle Http client and set the base uri of the API request as below inside setUp() function which is called before each test function call.
protected function setUp()
{
$this->client = new GuzzleHttp\Client([
'base_uri' => 'http://localhost/'
]);
}
One function is to test get post API request, so we are making a get request to url http://localhost/posts/index/1 to get the first post and are expecting a json content and the json content should have some fields and should have an id value of 1.
public function testGet_ValidInput_PostObject()
{
$response = $this->client->get('posts/index/1');
$this->assertEquals(200, $response->getStatusCode());
$data = json_decode($response->getBody(), true);
$this->assertArrayHasKey('id', $data);
$this->assertArrayHasKey('title', $data);
$this->assertArrayHasKey('content', $data);
$this->assertArrayHasKey('author_id', $data);
$this->assertArrayHasKey('emails_sent', $data);
$this->assertArrayHasKey('created_at', $data);
$this->assertArrayHasKey('updated_at', $data);
$this->assertEquals(1, $data['id']);
}
So we are using assertArrayHasKey() function to check if a particular field is present in the data set and assertEquals() to check for value.
Another function is to test POST request to create a new blog post.
public function testPost_NewBlog_Post()
{
$response = $this->client->post('posts/index', [
'form_params' => [
'title' => 'My Random Post',
'content' => 'Content',
'author_id' => 1
]
]);
$this->assertEquals(200, $response->getStatusCode());
$data = json_decode($response->getBody(), true);
$this->assertGreaterThanOrEqual(1, $data['id']);
}
In the above function we are creating a post request to the url http://localhost/posts/index with post parameters and are then expecting a 200 status code output and a json content with a field "id" which should have an integer value greater than or equal to 1.
Now that we are done with the tests, we can run them from the project root directory using below command:
$ ./vendor/bin/phpunit application/tests/
Basically phpunit and Guzzle Http client help us in making requests and verify responses thus enabling us to test APIs.
Ref: https://ole.michelsen.dk/blog/testing-your-api-with-phpunit.html
Excerpt: "Remember it's just as important to test failing/edge cases as testing when things go well. Also you should run these tests against an isolated testing environment if they modify your data."
Sunday, 14 February 2016
A link I found highlighting principles that guide us in development for an ethical web
I found this very simple yet very clear list of principles that can be kept in mind while developing for the web.
https://ethicalweb.org/
Excerpt from above link:
"As web developers, we are responsible for shaping the experiences of user's online lives. By making choices that are ethical and user-centered, we create a better web for everyone."
Hope it helps and guides us in creating a better web for everyone :)
https://ethicalweb.org/
Excerpt from above link:
"As web developers, we are responsible for shaping the experiences of user's online lives. By making choices that are ethical and user-centered, we create a better web for everyone."
Hope it helps and guides us in creating a better web for everyone :)
Saturday, 13 February 2016
Using git pre-commit hook for php and js syntax check
This is a followup from my two previous posts on php and js git pre-commit syntax check where I had mentioned how to check for php and js syntax independently using pre-commit with git.



But what if we wanted to check for both php and js syntax at same time while committing. So, I used the scripts used for both and combined them. Below is the final result.
#!/bin/bash
Give it execute permission: $ chmod +x .git/hooks/pre-commit and it should be good to go :)
Sample output when I try to commit two php files and two js files with syntax errors:
Filenames with code content:
error.php



But what if we wanted to check for both php and js syntax at same time while committing. So, I used the scripts used for both and combined them. Below is the final result.
#!/bin/bash
commit_error=false
ROOT_DIR="$(pwd)/"
LIST=$(git diff-index --cached --name-only --diff-filter=ACMR HEAD)
ERRORS_BUFFER=""
for file in $LIST
do
EXTENSION=$(echo "$file" | grep ".php$")
if [ "$EXTENSION" != "" ]; then
ERRORS=$(php -l "$ROOT_DIR$file" 2>&1 | grep "Parse error")
if [ "$ERRORS" != "" ]; then
if [ "$ERRORS_BUFFER" != "" ]; then
ERRORS_BUFFER="$ERRORS_BUFFER\n$ERRORS"
else
ERRORS_BUFFER="$ERRORS"
fi
echo "Syntax errors found in file: $file "
fi
# Check for xdebug statments
ERRORS=$(grep -nH xdebug_ "$ROOT_DIR$file" | \
sed -e 's/^/Found XDebug Statment : /')
if [ "$ERRORS" != "" ]; then
if [ "$ERRORS_BUFFER" != "" ]; then
ERRORS_BUFFER="$ERRORS_BUFFER\n$ERRORS"
else
ERRORS_BUFFER="$ERRORS"
fi
fi
fi
done
if [ "$ERRORS_BUFFER" != "" ]; then
echo
echo "Found PHP parse errors: "
echo -e $ERRORS_BUFFER
echo
echo "PHP parse errors found. Fix errors and commit again."
commit_error=true
else
echo "No PHP parse errors found. Committed successfully."
fi
files=$(git diff --cached --name-only --diff-filter=ACM | grep "\.js$")
if [ "$files" = "" ]; then
exit 0
fi
pass=true
JS_ERRORS_BUFFER=""
echo -e "\nValidating JavaScript:\n"
for file in ${files}; do
result=$(jslint ${file} | grep "${file} is OK")
if [ "$result" != "" ]; then
echo -e "\t\033[32mJSLint Passed: ${file}\033[0m"
else
JS_ERRORS=$(jslint ${file})
JS_ERRORS_BUFFER="$JS_ERRORS_BUFFER\n$JS_ERRORS"
echo -e "\t\033[31mJSLint Failed: ${file}\033[0m"
pass=false
fi
done
echo -e "\nJavaScript validation complete\n"
if ! $pass; then
echo -e "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass JSLint but do not. Please fix the JSLint errors and try again."
echo -e $JS_ERRORS_BUFFER
echo
commit_error=true
else
echo -e "\033[42mCOMMIT SUCCEEDED\033[0m\n"
fi
if $commit_error; then
exit 1
fi
Store it in .git/hooks/pre-commit
Sample output when I try to commit two php files and two js files with syntax errors:
Filenames with code content:
error.php
<?php
$array = ;
$array = ;
another_error.php
<?php
var_dump(');
error.js
i =
another_error.js
i = k;
$ git commit -m 'Error Commit' error.php another_error.php error.js another_error.js
Output from above error commit:
Syntax errors found in file: another_error.php
Syntax errors found in file: error.php
Found PHP parse errors:
PHP Parse error: syntax error, unexpected ';' in /var/www/html/error.php on line 2
PHP Parse error: syntax error, unexpected '');' (T_ENCAPSED_AND_WHITESPACE) in /var/www/html/another_error.php on line 2
PHP parse errors found. Fix errors and commit again.
Validating JavaScript:
JSLint Failed: error.js
JSLint Failed: another_error.js
JavaScript validation complete
COMMIT FAILED: Your commit contains files that should pass JSLint but do not. Please fix the JSLint errors and try again.
error.js #1 'i' was used before it was defined. i = // Line 1, Pos 1 #2 Unexpected character '(space)'. i = // Line 1, Pos 4 #3 Unexpected '(end)'. i = // Line 1, Pos 3 #4 Stopping. (50% scanned). // Line 1, Pos 3
another_error.js #1 'i' was used before it was defined. i = k; // Line 1, Pos 1 #2 'k' was used before it was defined. i = k; // Line 1, Pos 5
Above script can be further modified to format the output better but is helpful for basic php and js syntax issues and js standard checks in code :)
Above script can be further modified to format the output better but is helpful for basic php and js syntax issues and js standard checks in code :)
Labels:
git,
github,
javascript,
jslint,
php,
pre-commit,
quality,
standards,
syntax,
ubuntu
Friday, 12 February 2016
Associating git hooks with js syntax check
This is a followup article from my previous post.
Here we will be using git pre-commit to check for syntax error while committing in JavaScript files.
We will need nodejs in our system. Please check https://nodejs.org/en/ for downloading and install steps.
Note: I am using ubuntu 14.04 for this setup.
Steps to add pre-commit JavaScript syntax check with git:
1. Use npm to install jslint package globally in your system.
https://www.npmjs.com/package/jslint
$ npm install -g jslint
This should globally install jslint in your system and can be referenced as below to check syntax error for any js file.
$ jslint sample.js
Sample output from above command:
Note: Please also refer rules and standards being followed by jslint for checking here. Makes a nice read. :)
2. Now that jslint is globally available, let us use it and create a pre-commit file.
I found below links which highlight the use of it in a script:
http://stackoverflow.com/questions/15703065/setup-pre-commit-hook-jshint
http://dev.venntro.com/2012/11/maintaining-consistent-javascript-with-jslint/
The only disadvantage I see in the script is that it only highlights passed and failed JavaScript files with names and does not specify the error in each.
So, I made a few changes to the script as below (highlighted in blue):
#!/bin/sh
3. Save the above script in your git pre-commit file as below:
$ cd /project/directory/
$ vim .git/hooks/pre-commit
Paste the above content and save it. Then give execute permission to it.
$ chmod +x .git/hooks/pre-commit
And we are done and ready :)
Trying a sample case:
I have two js files named sample.js and another.js with below content:
sample.js:
$ git commit -m 'Error Commit' sample.js another.js
Below is the pre-commit check output:
Here we will be using git pre-commit to check for syntax error while committing in JavaScript files.
We will need nodejs in our system. Please check https://nodejs.org/en/ for downloading and install steps.
Note: I am using ubuntu 14.04 for this setup.
Steps to add pre-commit JavaScript syntax check with git:
1. Use npm to install jslint package globally in your system.
https://www.npmjs.com/package/jslint
$ npm install -g jslint
This should globally install jslint in your system and can be referenced as below to check syntax error for any js file.
$ jslint sample.js
for (i = 0; i < 10; i++)
{
sum += i;
}
Sample output from above command:
sample.js
#1 'i' was used before it was defined.
for (i = 0; i < 10; i++) // Line 1, Pos 6
#2 'i' was used before it was defined.
for (i = 0; i < 10; i++) // Line 1, Pos 13
#3 'i' was used before it was defined.
for (i = 0; i < 10; i++) // Line 1, Pos 21
#4 Unexpected '++'.
for (i = 0; i < 10; i++) // Line 1, Pos 22
#5 Expected exactly one space between ')' and '{'.
{ // Line 2, Pos 1
#6 Use spaces, not tabs.
sum += i; // Line 3, Pos 1
#7 Expected 'sum' at column 9, not column 2.
sum += i; // Line 3, Pos 2
#8 'i' was used before it was defined.
sum += i; // Line 3, Pos 9
#9 Expected '}' at column 5, not column 1.
} // Line 4, Pos 1
Above info is quite informative and helpful to fix basic syntax errors, missing semi-colons, indentation etc.
Correcting the above errors to below code and running jslint again:
var i, sum = 0;
for (i = 0; i < 10; i = i + 1) {
sum += i;
}
Output from jslint:
sample.js is OK.
Note: Please also refer rules and standards being followed by jslint for checking here. Makes a nice read. :)
I found below links which highlight the use of it in a script:
http://stackoverflow.com/questions/15703065/setup-pre-commit-hook-jshint
http://dev.venntro.com/2012/11/maintaining-consistent-javascript-with-jslint/
The only disadvantage I see in the script is that it only highlights passed and failed JavaScript files with names and does not specify the error in each.
So, I made a few changes to the script as below (highlighted in blue):
#!/bin/sh
files=$(git diff --cached --name-only --diff-filter=ACM | grep "\.js$")
if [ "$files" = "" ]; then
exit 0
fi
pass=true
ERRORS_BUFFER=""
echo -e "\nValidating JavaScript:\n"
for file in ${files}; do
result=$(jslint ${file} | grep "${file} is OK")
if [ "$result" != "" ]; then
echo -e "\t\033[32mJSLint Passed: ${file}\033[0m"
else
ERRORS=$(jslint ${file})
ERRORS_BUFFER="$ERRORS_BUFFER\n$ERRORS"
echo -e "\t\033[31mJSLint Failed: ${file}\033[0m"
pass=false
fi
done
echo -e "\nJavaScript validation complete\n"
if ! $pass; then
echo -e "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass JSLint but do not. Please fix the JSLint errors and try again."
echo -e $ERRORS_BUFFER
echo
exit 1
else
echo -e "\033[42mCOMMIT SUCCEEDED\033[0m\n"
fi
3. Save the above script in your git pre-commit file as below:
$ cd /project/directory/
$ vim .git/hooks/pre-commit
Paste the above content and save it. Then give execute permission to it.
$ chmod +x .git/hooks/pre-commit
And we are done and ready :)
Trying a sample case:
I have two js files named sample.js and another.js with below content:
sample.js:
var i = j;
for (key in names) {
echo names[key];
}
another.js:
var i = []
Lets try to commit them:
Below is the pre-commit check output:
Validating JavaScript:
JSLint Failed: sample.js
JSLint Failed: true.js
JavaScript validation complete
COMMIT FAILED: Your commit contains files that should pass JSLint but do not. Please fix the JSLint errors and try again.
sample.js #1 'j' was used before it was defined. var i = j; // Line 1, Pos 9 #2 'key' was used before it was defined. for (key in names) { // Line 3, Pos 6 #3 Cannot read property 'kind' of undefined // Line 3, Pos 10
true.js #1 Expected ';' and instead saw '(end)'. var i = [] // Line 1, Pos 11
The output can be formatted a little bit better to place each line error in a new line of its own. But this simple tool is pretty handy for checking js errors while committing :)
Sunday, 7 February 2016
How to generate text representation of an image using PHP?
We will learn how to convert an image to its text representation using PHP that can be used in an html page (if any such requirement arises in your application or just for fun sake :) ).
The steps followed to convert the image to text representation are:
1. Get the width and height of the image to be converted.
2. Loop through every pixel value in the image.
3. At every pixel value, find the color at that position.
4. Apply that color to a # symbol we use to represent that pixel.
5. Finally we get the text representation of the image represented by # (hashes).
Code:
<html>
<body style="background-color: #000000;">
<tt>
<?php
$img = imagecreatefromjpeg('red_leaf.jpg');
$dx = imagesx($img);
$dy = imagesy($img);
// Loop through each pixel in the image and check the color
// Then do something with that color data like display the # character
// at the appropriate color for each pixel.
for ($y = 0; $y < $dy; $y++)
{
for ($x = 0; $x < $dx; $x++)
{
$col = imagecolorat($im, $x, $y);
$rgb = imagecolorsforindex($im, $col);
printf('<font color=#%02x%02x%02x>#</font>',
$rgb['red'], $rgb['green'], $rgb['blue']);
}
echo "<br>\n";
}
imagedestroy($im);
?>
</tt>
</body>
</html>
The steps followed to convert the image to text representation are:
1. Get the width and height of the image to be converted.
2. Loop through every pixel value in the image.
3. At every pixel value, find the color at that position.
4. Apply that color to a # symbol we use to represent that pixel.
5. Finally we get the text representation of the image represented by # (hashes).
Code:
<html>
<body style="background-color: #000000;">
<tt>
<?php
$img = imagecreatefromjpeg('red_leaf.jpg');
$dx = imagesx($img);
$dy = imagesy($img);
// Loop through each pixel in the image and check the color
// Then do something with that color data like display the # character
// at the appropriate color for each pixel.
for ($y = 0; $y < $dy; $y++)
{
for ($x = 0; $x < $dx; $x++)
{
$col = imagecolorat($im, $x, $y);
$rgb = imagecolorsforindex($im, $col);
printf('<font color=#%02x%02x%02x>#</font>',
$rgb['red'], $rgb['green'], $rgb['blue']);
}
echo "<br>\n";
}
imagedestroy($im);
?>
</tt>
</body>
</html>
Image used in the program:
Sample output can be seen here.
Cool isn't it :)
Friday, 5 February 2016
Associating git hooks with php syntax check
Many a times we have faced this problem that when we commit something and it breaks something on the server due to some syntax error.
To address this, we can use git pre-commit hooks to check for any syntax errors in the to be committed files.
There is a good script I found which does this at https://github.com/ReekenX/phpcheck-git
Steps to add pre-commit php syntax check with git:
(Issue below commands in your console)
1. $ cd /project/directory/
2. $ cd .git/hooks/
3. Get the pre-commit script file from above github page or from direct link: https://raw.githubusercontent.com/ReekenX/phpcheck-git/master/pre-commit
$ wget https://raw.githubusercontent.com/ReekenX/phpcheck-git/master/pre-commit
4. Give execute permission to it.
$ chmod +x pre-commit
This should be it :)
Now if you try to commit any php file, it will display message about any syntax error. If there are, then it will specify the file, error and line number where the error took place and will abort the commit.
This small tool will help us in better checking our code before being committed :)
I know that these can be caught by IDEs and good editors, but sometimes there might be an syntax error introduced after a code merge conflict resolution and commit.
To address this, we can use git pre-commit hooks to check for any syntax errors in the to be committed files.
There is a good script I found which does this at https://github.com/ReekenX/phpcheck-git
Steps to add pre-commit php syntax check with git:
(Issue below commands in your console)
1. $ cd /project/directory/
2. $ cd .git/hooks/
3. Get the pre-commit script file from above github page or from direct link: https://raw.githubusercontent.com/ReekenX/phpcheck-git/master/pre-commit
$ wget https://raw.githubusercontent.com/ReekenX/phpcheck-git/master/pre-commit
4. Give execute permission to it.
$ chmod +x pre-commit
This should be it :)
Now if you try to commit any php file, it will display message about any syntax error. If there are, then it will specify the file, error and line number where the error took place and will abort the commit.
This small tool will help us in better checking our code before being committed :)
Subscribe to:
Posts (Atom)





