# $Id: /local/CPAN/Mango/t/lib/Mango/Tests/Catalyst/Admin/Products.pm 1644 2008-06-02T01:46:53.055259Z claco $
package Mango::Tests::Catalyst::Admin::Products;
use strict;
use warnings;
BEGIN {
use base 'Mango::Test::Class';
use Test::More;
use Path::Class ();
}
sub startup : Test(startup => +1) {
my $self = shift;
$self->SUPER::startup(@_);
use_ok('Mango::Provider::Products');
my $provider = Mango::Provider::Products->new(
{
connection_info => [
'dbi:SQLite:'
. Path::Class::file( $self->application, 'data', 'mango.db' )
]
}
);
$provider->create(
{
sku => 'DEF-345',
price => 10.00,
name => 'DEF Product',
description => 'DEF Product Description',
tags => [qw/tag2/],
attributes => [
{
name => 'ExistingAttribute',
value => 'ExistingValue'
}
]
}
);
}
sub path {'admin/products'};
sub tests_unauthorized: Test(2) {
my $self = shift;
my $m = $self->client;
$m->get('http://localhost/' . $self->path . '/');
is( $m->status, 401 );
$self->validate_markup($m->content);
}
sub tests : Test(164) {
my $self = shift;
my $m = $self->client;
## no tag products
$m->get_ok('http://localhost/');
$self->validate_markup($m->content);
$m->follow_link_ok({text => 'Products'});
$m->title_like(qr/products/i);
ok( !$m->find_link( text => 'tag1' ));
$self->validate_markup($m->content);
## login
$m->follow_link_ok({text => 'Login'});
$self->validate_markup($m->content);
$m->title_like(qr/login/i);
$m->submit_form_ok({
form_id => 'login',
fields => {
username => 'admin',
password => 'admin'
}
});
$self->validate_markup($m->content);
## get to the admin products page
$m->follow_link_ok({text => 'Admin'});
$self->validate_markup($m->content);
my $path = $self->path;
$m->follow_link_ok({text => 'Products', url_regex => qr/$path/i});
$self->validate_markup($m->content);
my $create = "$path\/create";
$m->follow_link_ok({url_regex => qr/$create/i});
$self->validate_markup($m->content);
## fail to add product
$m->submit_form_ok({
form_id => 'admin_products_create',
fields => {}
});
$m->content_contains('
CONSTRAINT_SKU_NOT_BLANK');
$m->content_contains('The name field is required.');
$m->content_contains('CONSTRAINT_DESCRIPTION_NOT_BLANK');
$m->content_contains('CONSTRAINT_PRICE_NOT_BLANK');
$self->validate_markup($m->content);
## fail to add existing product
$m->submit_form_ok({
form_id => 'admin_products_create',
fields => {
sku => 'DEF-345',
name => 'My SKU',
description => 'My SKU Description',
price => 1.23,
tags => 'tag1'
}
});
$m->content_contains('CONSTRAINT_SKU_UNIQUE');
$self->validate_markup($m->content);
## add new product
$m->submit_form_ok({
form_id => 'admin_products_create',
fields => {
sku => 'ABC-123',
name => 'My SKU',
description => 'My SKU Description',
price => 1.23,
tags => 'tag1'
}
});
$m->content_lacks('CONSTRAINT_SKU_NOT_BLANK');
$m->content_lacks('The name field is required.');
$m->content_lacks('CONSTRAINT_DESCRIPTION_NOT_BLANK');
$m->content_lacks('CONSTRAINT_PRICE_NOT_BLANK');
is($m->uri->path, '/' . $self->path . '/2/edit/');
$self->validate_markup($m->content);
## add attributes
$m->follow_link_ok({text_regex => qr/edit.*attributes/i, url_regex => qr/attributes/i});
$self->validate_markup($m->content);
$m->follow_link_ok({text_regex => qr/new.*attribute/i, url_regex => qr/create/i});
$self->validate_markup($m->content);
$m->submit_form_ok({
form_id => 'admin_products_attributes_create',
fields => {
name => '',
value => ''
}
});
$self->validate_markup($m->content);
$m->content_contains('The name field is required.');
$m->content_contains('CONSTRAINT_VALUE_NOT_BLANK');
$m->submit_form_ok({
form_id => 'admin_products_attributes_create',
fields => {
name => 'Attribute1',
value => 'Value1'
}
});
$self->validate_markup($m->content);
$m->content_lacks('The name field is required.');
$m->content_lacks('CONSTRAINT_VALUE_NOT_BLANK');
is($m->uri->path, '/' . $self->path . '/2/attributes/2/edit/');
## edit exiting product
$m->follow_link_ok({text => 'Products', url_regex => qr/$path/i});
$self->validate_markup($m->content);
$m->follow_link_ok({text_regex => qr/DEF-345/, url_regex => qr/edit/i});
$self->validate_markup($m->content);
is($m->uri->path, '/' . $self->path . '/1/edit/');
## fail edit
$m->submit_form_ok({
form_id => 'admin_products_edit',
fields => {
sku => '',
name => '',
description => '',
price => ''
}
});
$self->validate_markup($m->content);
$m->content_contains('CONSTRAINT_SKU_NOT_BLANK');
$m->content_contains('The name field is required.');
$m->content_contains('CONSTRAINT_DESCRIPTION_NOT_BLANK');
$m->content_contains('CONSTRAINT_PRICE_NOT_BLANK');
## fail edit duplicate product
$m->submit_form_ok({
form_id => 'admin_products_edit',
fields => {
sku => 'ABC-123',
name => 'My DEF SKU',
description => 'My DEF Description',
price => 3.45,
tags => 'tag3'
}
});
$m->content_contains('CONSTRAINT_SKU_UNIQUE');
$self->validate_markup($m->content);
## continue edit
$m->submit_form_ok({
form_id => 'admin_products_edit',
fields => {
sku => 'DEF-345',
name => 'My DEF SKU',
description => 'My DEF Description',
price => 3.45,
tags => 'tag3'
}
});
$m->content_lacks('CONSTRAINT_SKU_NOT_BLANK');
$m->content_lacks('The name field is required.');
$m->content_lacks('CONSTRAINT_DESCRIPTION_NOT_BLANK');
$m->content_lacks('CONSTRAINT_PRICE_NOT_BLANK');
$self->validate_markup($m->content);
## fail adding duplicate attribute
$m->follow_link_ok({text_regex => qr/edit.*attributes/i, url_regex => qr/attributes/i});
$self->validate_markup($m->content);
$m->follow_link_ok({text_regex => qr/new.*attribute/i, url_regex => qr/create/i});
$self->validate_markup($m->content);
$m->submit_form_ok({
form_id => 'admin_products_attributes_create',
fields => {
name => 'ExistingAttribute',
value => 'Existingvalue'
}
});
$m->content_contains('CONSTRAINT_NAME_UNIQUE');
$self->validate_markup($m->content);
## edit existing attribute
$m->follow_link_ok({text => 'Products', url_regex => qr/$path/i});
$self->validate_markup($m->content);
$m->follow_link_ok({text_regex => qr/DEF-345/, url_regex => qr/edit/i});
$self->validate_markup($m->content);
$m->follow_link_ok({text_regex => qr/edit.*attributes/i, url_regex => qr/attributes/i});
$self->validate_markup($m->content);
$m->follow_link_ok({text_regex => qr/ExistingAttribute/i, url_regex => qr/attributes.*edit/i});
$self->validate_markup($m->content);
$m->submit_form_ok({
form_id => 'admin_products_attributes_edit',
fields => {
name => '',
value => ''
}
});
$self->validate_markup($m->content);
$m->content_contains('The name field is required.');
$m->content_contains('CONSTRAINT_VALUE_NOT_BLANK');
$m->submit_form_ok({
form_id => 'admin_products_attributes_edit',
fields => {
name => 'EditAttribute',
value => 'EditValue'
}
});
$m->content_lacks('The name field is required.');
$m->content_lacks('CONSTRAINT_VALUE_NOT_BLANK');
$self->validate_markup($m->content);
## view new product in list
$m->get_ok('http://localhost/');
$self->validate_markup($m->content);
$m->follow_link_ok({text => 'Products'});
$self->validate_markup($m->content);
$m->title_like(qr/products/i);
$m->follow_link_ok({text => 'tag1'});
$self->validate_markup($m->content);
is($m->uri->path, '/products/tags/tag1/');
$m->content_contains('ABC-123');
$m->content_contains('My SKU Description');
$m->content_contains('$1.23');
## view new product
$m->follow_link_ok({text => 'My SKU'});
$self->validate_markup($m->content);
is($m->uri->path, '/products/ABC-123/');
$m->content_contains('ABC-123');
$m->content_contains('My SKU Description');
$m->content_contains('$1.23');
$m->content_contains('Attribute1: Value1');
## view edited product in list
$m->get_ok('http://localhost/');
$self->validate_markup($m->content);
$m->follow_link_ok({text => 'Products'});
$self->validate_markup($m->content);
$m->title_like(qr/products/i);
$m->follow_link_ok({text => 'tag3'});
$self->validate_markup($m->content);
is($m->uri->path, '/products/tags/tag3/');
$m->content_contains('DEF-345');
$m->content_contains('My DEF Description');
$m->content_contains('$3.45');
## view edited product
$m->follow_link_ok({text => 'My DEF SKU'});
$self->validate_markup($m->content);
is($m->uri->path, '/products/DEF-345/');
$m->content_contains('DEF-345');
$m->content_contains('My DEF Description');
$m->content_contains('$3.45');
$m->content_contains('EditAttribute: EditValue');
$m->content_lacks('ExistingAttribute: ExistingValue');
## delete an attribute
$m->follow_link_ok({text => 'Admin'});
$self->validate_markup($m->content);
$m->follow_link_ok({text => 'Products', url_regex => qr/$path/i});
$self->validate_markup($m->content);
$m->follow_link_ok({text_regex => qr/DEF-345/, url_regex => qr/edit/i});
$self->validate_markup($m->content);
is($m->uri->path, '/' . $self->path . '/1/edit/');
$m->follow_link_ok({text_regex => qr/edit.*attributes/i, url_regex => qr/attributes/i});
$self->validate_markup($m->content);
$m->submit_form_ok({
form_id => 'admin_products_attributes_delete_1',
});
$self->validate_markup($m->content);
## delete a product
$m->follow_link_ok({text => 'Admin'});
$self->validate_markup($m->content);
$m->follow_link_ok({text => 'Products', url_regex => qr/$path/i});
$self->validate_markup($m->content);
$m->submit_form_ok({
form_id => 'admin_products_delete_2'
});
$self->validate_markup($m->content);
## verify deletes
$m->get_ok('http://localhost/');
$self->validate_markup($m->content);
$m->follow_link_ok({text => 'Products'});
$self->validate_markup($m->content);
$m->title_like(qr/products/i);
ok(!$m->find_link(text => 'tag1'));
$m->get('http://localhost/' . $self->path . '/ABC-123/');
is($m->status, 404);
$self->validate_markup($m->content);
$m->get_ok('http://localhost/');
$self->validate_markup($m->content);
$m->follow_link_ok({text => 'Products'});
$self->validate_markup($m->content);
$m->follow_link_ok({text => 'tag3'});
$self->validate_markup($m->content);
$m->follow_link_ok({text => 'My DEF SKU'});
$self->validate_markup($m->content);
is($m->uri->path, '/products/DEF-345/');
$m->content_contains('DEF-345');
$m->content_contains('My DEF Description');
$m->content_contains('$3.45');
$m->content_lacks('EditAttribute: EditValue');
}
1;