# $Id: /local/CPAN/Mango/t/lib/Mango/Tests/Catalyst/Cart.pm 1644 2008-06-02T01:46:53.055259Z claco $ package Mango::Tests::Catalyst::Cart; 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 => 'ABC-123', price => 1.23, name => 'ABC Product', description => 'ABC Product Description', tags => [qw/tag1/] } ); $provider->create( { sku => 'DEF-345', price => 10.00, name => 'DEF Product', description => 'DEF Product Description', tags => [qw/tag2/] } ); } sub path {'cart'}; sub tests : Test(96) { my $self = shift; my $m = $self->client; ## cart is empty $m->get_ok('http://localhost/'); $self->validate_markup($m->content); $m->follow_link_ok({text => 'Cart'}); $m->title_like(qr/cart/i); $m->content_like(qr/cart is empty/i); is($m->uri->path, '/' . $self->path . '/'); $self->validate_markup($m->content); ## add missing part/sku $m->follow_link_ok({text => 'Products'}); $m->title_like(qr/products/i); $self->validate_markup($m->content); $m->follow_link_ok({text => 'tag1'}); { local $SIG{__WARN__} = sub {}; $m->submit_form_ok({ form_id => 'cart_add_1', fields => { sku => 'NOT-FOUND', quantity => 2 } }); } $m->title_like(qr/cart/i); $m->content_like(qr/part.*could not be found/i); $self->validate_markup($m->content); ## add existing part/sku $m->follow_link_ok({text => 'Products'}); $m->title_like(qr/products/i); $self->validate_markup($m->content); $m->follow_link_ok({text => 'tag1'}); { local $SIG{__WARN__} = sub {}; $m->submit_form_ok({ form_id => 'cart_add_1', fields => { sku => 'ABC-123', quantity => 2 } }); }; $m->title_like(qr/cart/i); $m->content_contains('ABC-123'); $m->content_contains('ABC Product Description'); $m->content_contains('$1.23'); $m->content_contains('$2.46'); $self->validate_markup($m->content); ## update quantity $m->submit_form_ok({ form_id => 'cart_items_update_1', fields => { quantity => 3 } }); $m->title_like(qr/cart/i); $m->content_contains('ABC-123'); $m->content_contains('ABC Product Description'); $m->content_contains('$1.23'); $m->content_contains('$3.69'); $self->validate_markup($m->content); ## update with non numeric $m->submit_form_ok({ form_id => 'cart_items_update_1', fields => { quantity => 'a' } }); $m->title_like(qr/cart/i); $m->content_like(qr/quantity must be.*number/i); $m->content_contains('ABC-123'); $m->content_contains('ABC Product Description'); $m->content_contains('$1.23'); $m->content_contains('$3.69'); $self->validate_markup($m->content); ## add another item $m->follow_link_ok({text => 'Products'}); $self->validate_markup($m->content); $m->title_like(qr/products/i); $m->follow_link_ok({text => 'tag2'}); { local $SIG{__WARN__} = sub {}; $m->submit_form_ok({ form_id => 'cart_add_2', fields => { sku => 'DEF-345', quantity => 2 } }); }; $m->title_like(qr/cart/i); $m->content_contains('ABC-123'); $m->content_contains('ABC Product Description'); $m->content_contains('$1.23'); $m->content_contains('$3.69'); $m->content_contains('DEF-345'); $m->content_contains('DEF Product Description'); $m->content_contains('$10.00'); $m->content_contains('$20.00'); $m->content_contains('$23.69'); $self->validate_markup($m->content); ## delete an item { local $SIG{__WARN__} = sub {}; $m->submit_form_ok({ form_id => 'cart_items_delete_1' }); }; $m->title_like(qr/cart/i); $m->content_lacks('ABC-123'); $m->content_lacks('ABC Product Description'); $m->content_lacks('$1.23'); $m->content_lacks('$3.69'); $m->content_contains('DEF-345'); $m->content_contains('DEF Product Description'); $m->content_contains('$10.00'); $m->content_contains('$20.00'); $self->validate_markup($m->content); ## can't save as anonymous { local $SIG{__WARN__} = sub {}; $m->submit_form_ok({ form_id => 'cart_save' }); }; $m->title_like(qr/cart/i); $m->content_like(qr/must be logged in/i); $self->validate_markup($m->content); ## can't save if name is missing $m->follow_link_ok({text => 'Login'}); $self->validate_markup($m->content); $m->submit_form_ok({ form_id => 'login', fields => { username => 'admin', password => 'admin' } }); $m->title_like(qr/login/i); $m->content_like(qr/login successful/i); $self->validate_markup($m->content); $m->follow_link_ok({text => 'Cart'}); $m->title_like(qr/cart/i); { local $SIG{__WARN__} = sub {}; $m->submit_form_ok({ form_id => 'cart_save', }); }; $m->title_like(qr/cart/i); $m->content_like(qr/name field is required/i); $self->validate_markup($m->content); ## clear the cart { local $SIG{__WARN__} = sub {}; $m->submit_form_ok({ form_id => 'cart_clear' }); }; $m->title_like(qr/cart/i); $m->content_lacks('ABC-123'); $m->content_lacks('ABC Product Description'); $m->content_lacks('$1.23'); $m->content_lacks('$3.69'); $m->content_lacks('DEF-345'); $m->content_lacks('DEF Product Description'); $m->content_lacks('$10.00'); $m->content_lacks('$20.00'); $m->content_like(qr/cart is empty/i); $self->validate_markup($m->content); } sub tests_not_found : Test(2) { my $self = shift; my $m = $self->client; $m->get('http://localhost/cart/'); if ($self->path eq 'cart') { is( $m->status, 200 ); } else { is( $m->status, 404 ); } $self->validate_markup($m->content); } 1;