CGI-Widget-DBI-Search

 view release on metacpan or  search on metacpan

lib/CGI/Widget/DBI/Search/Display/TEST/Grid.pm  view on Meta::CPAN


sub test_search__basic
{
    my $self = shift;
    # TODO: move these superclass calls into set_up method
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'tr', 'td' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'td', 'tr' ],
    );
}

sub test_search__display_only_subset_of_columns
{
    my $self = shift;
    $self->{ws}->{-display_columns} = { map {$_ => $_} qw/widget_no name size/ };
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'tr', 'td' ],
        [ 1, 'clock_widget', 'small' ],
        [ 2, 'calendar_widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 3, 'silly_widget', 'unknown' ],
        [ 4, 'gps_widget', 'medium' ],
        [ 'td', 'tr' ],
    );
    $self->assert_display_does_not_contain( [ 'A time keeper widget', ] );
    $self->assert_display_does_not_contain( [ 'A date tracker widget', ] );
    $self->assert_display_does_not_contain( [ 'A goofball widget', ] );
}

lib/CGI/Widget/DBI/Search/Display/TEST/Grid.pm  view on Meta::CPAN

    $self->{ws}->{-columndata_closures} = {
        my_header1 => sub { my ($self, $row) = @_; return "Widget #".$row->{widget_no}; },
        my_header2 => sub { my ($self, $row) = @_; return "Widget Size: ".$row->{size}; },
        my_header3 => sub { return "a***b"; },
    };
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'tr', 'td' ],
        [ 'Widget #1', 1, 'clock_widget', 'A time keeper widget', 'small', 'Widget Size', 'small', 'my_header3', 'a\*\*\*b', ],
        [ 'Widget #2', 2, 'calendar_widget', 'A date tracker widget', 'medium', 'Widget Size', 'medium', 'my_header3', 'a\*\*\*b', ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 'Widget #3', 3, 'silly_widget', 'A goofball widget', 'unknown', 'Widget Size', 'unknown', 'my_header3', 'a\*\*\*b', ],
        [ 'td', 'tr' ],
    );
}

sub test_search__with_a_join
{
    my $self = shift;
    $self->SUPER::test_search__with_a_join;

lib/CGI/Widget/DBI/Search/Display/TEST/Grid.pm  view on Meta::CPAN

    $self->assert_display_contains(
        [ 'div', 'align', 'right', 'Sort by', 'sortby_columns_popup', 'Sort field',
          'sortby=widget_no', 'widget_no', 'sortby=name', 'name',
          'sortby=description', 'description', 'sortby=size', 'size',
          'sortby=tool_no', 'tool_no', 'sortby=tool_name', 'tool_name',
          'sortby=type', 'type', ],
        [ 'tr', 'td' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small', 2, 'wrench', 'hand' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small', 1, 'hammer', 'hand' ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium', 5, 'emacs', 'software' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium', 6, 'apache', 'software' ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown', 4, 'rm', 'unix' ],
        [ 'td', 'tr' ],
    );
}

sub test_search__with_a_filter
{
    my $self = shift;
    $self->SUPER::test_search__with_a_filter;

    # only displays most recent filter
    $self->assert_display_contains(
        [ 'tr', 'td' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr' ],
    );
}

sub test_search__paging
{
    my $self = shift;
    $self->SUPER::test_search__paging;

    # only displays most recent page of search

lib/CGI/Widget/DBI/Search/Display/TEST/Grid.pm  view on Meta::CPAN


    # only displays most recent sorting
    $self->assert_display_contains(
        [ 'div', 'align', 'right', 'Sort by', 'sortby_columns_popup',
          'sortby=widget_no', 'widget_no', 'sortby=name', 'name',
          'sortby=description', 'description', 'sortby=size', 'size' ],
        [ 'tr', 'td' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 'td', 'tr' ],
    );
}

sub test_search__sorting__supports_href_and_form_extra_vars
{
    my $self = shift;
    my $ws = $self->{ws};

lib/CGI/Widget/DBI/Search/Display/TEST/Grid.pm  view on Meta::CPAN

    $ws->search();

    # only displays most recent sorting
    $self->assert_display_contains(
        [ 'input type="hidden" name="form_hiddenvar" value="bar' ],
        [ 'div', 'align', 'right', 'Sort by', 'sortby_columns_popup',
          'sortby=widget_no&href_testvar=foo', 'widget_no', 'sortby=name&href_testvar=foo', 'name',
          'sortby=description&href_testvar=foo', 'description', 'sortby=size&href_testvar=foo', 'size' ],
        [ 'tr', 'td' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'td', 'tr' ],
    );
}

sub test_search__sorting_in_action_uri_js_function_mode__supports_href_and_form_extra_vars
{
    my $self = shift;

lib/CGI/Widget/DBI/Search/Display/TEST/Grid.pm  view on Meta::CPAN

    $ws->{-action_uri_js_function} = 'myCustomFunc';
    $ws->search();

    # only displays most recent sorting
    $self->assert_display_contains(
        [ 'input type="hidden" name="form_hiddenvar" value="bar' ],
        [ 'div', 'align', 'right', 'Sort by', 'sortby_columns_popup', ],
        [ map { ("\QmyCustomFunc({ 'sortby': '$_', 'href_testvar': 'foo&#39\E", $_) } qw/widget_no name description size/ ],
        [ 'tr', 'td' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'td', 'tr' ],
    );
}

sub test_search__only_allows_sorting_by_specified_columns
{
    my $self = shift;

lib/CGI/Widget/DBI/Search/Display/TEST/Grid.pm  view on Meta::CPAN

    $ws->{q}->param('sortby', 'widget_no');

    $ws->{-unsortable_columns} = {size => 1};
    $ws->search();

    $self->assert_display_contains(
        [ 'div', 'align', 'right', 'Sort by', 'sortby_columns_popup',
          'sortby=widget_no', 'widget_no', 'sortby=name', 'name',
          'sortby=description', 'description' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'td', 'tr' ],
    );
    $self->assert_display_does_not_contain([ 'sortby=size', 'size' ]);

    # reset and search again
    $self->init_test_object();
    $self->_setup_test_search__sorting();

lib/CGI/Widget/DBI/Search/Display/TEST/Grid.pm  view on Meta::CPAN

    $ws->{-sortable_columns} = {widget_no => 1, name => 1};
    $ws->search();

    $self->assert_display_contains(
        [ 'div align="right', 'Sort by', 'sortby_columns_popup' ],
        [ 'option value="\?sortby=name">name' ],
        [ 'option selected="selected" value="\?sortby=widget_no&sort_reverse=0">widget_no', ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 'td', 'tr' ],
    );
    $self->assert_display_does_not_contain([ 'sortby=description', 'description' ]);
    $self->assert_display_does_not_contain([ 'sortby=size', 'size' ]);
}

sub test_search__default_orderby_and_sorting
{
    my $self = shift;
    $self->SUPER::test_search__default_orderby_and_sorting;

    # only displays most recent sorting
    $self->assert_display_contains(
        [ 'tr', 'td' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 'td', 'tr' ],
    );
}

sub test_search__css_options
{
    my $self = shift;
    $self->{ws}->{-css_grid_class} = 'TestGridClass';
    $self->{ws}->{-css_grid_cell_class} = 'TestGridCellClass';
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'table [^<>]*class="TestGridClass' ],
        [ 'tr', 'td [^<>]*class="TestGridCellClass' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 'td [^<>]*class="TestGridCellClass' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td [^<>]*class="TestGridCellClass' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 'td [^<>]*class="TestGridCellClass' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'td', 'tr' ],
    );
}

sub test_search__extra_attributes
{
    my $self = shift;
    $self->{ws}->{-extra_grid_cell_attributes} = { test_attr1 => 'foo', test_attr2 => 'bar' };
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'table' ],
        [ 'tr', 'td [^<>]*test-attr(?:2="bar"|1="foo") [^<>]*test-attr(?:2="bar"|1="foo")[^<>]*><' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 'td [^<>]*test-attr(?:2="bar"|1="foo") [^<>]*test-attr(?:2="bar"|1="foo")[^<>]*><' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td [^<>]*test-attr(?:2="bar"|1="foo") [^<>]*test-attr(?:2="bar"|1="foo")[^<>]*><' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 'td [^<>]*test-attr(?:2="bar"|1="foo") [^<>]*test-attr(?:2="bar"|1="foo")[^<>]*><' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'td', 'tr' ],
    );
}

sub test_search__extra_attributes_closure
{

lib/CGI/Widget/DBI/Search/Display/TEST/Grid.pm  view on Meta::CPAN

        my $col1 = $obj->{'header_columns'}->[0];
        my $col2 = $obj->{'header_columns'}->[1];
        return { 'attr_'.$col1 => $row->{$col1}, 'attr_'.$col2 => $row->{$col2} };
    };
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'table' ],
        [ 'tr', 'td [^<>]*attr-(?:widget-no="1"|name="clock_widget") [^<>]*attr-(?:widget-no="1"|name="clock_widget")[^<>]*><' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 'td [^<>]*attr-(?:widget-no="2"|name="calendar_widget") [^<>]*attr-(?:widget-no="2"|name="calendar_widget")[^<>]*><' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td [^<>]*attr-(?:widget-no="3"|name="silly_widget") [^<>]*attr-(?:widget-no="3"|name="silly_widget")[^<>]*><' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 'td [^<>]*attr-(?:widget-no="4"|name="gps_widget") [^<>]*attr-(?:widget-no="4"|name="gps_widget")[^<>]*><' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'td', 'tr' ],
    );
}

sub test_browse_mode
{
    my $self = shift;
    $self->{ws}->{-browse_mode} = 1;
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'tr', 'td' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 'td', 'tr' ],
    );
    $self->assert_display_does_not_contain([ 'At first page', 'At last page' ]);
    $self->assert_display_does_not_contain([ 'Sort by', 'sortby_columns_popup' ]);
    $self->assert_display_does_not_contain([ 'Sort field' ]);
    $self->assert_display_does_not_contain([ 'sortby=widget_no', 'widget_no' ]);
    $self->assert_display_does_not_contain([ 'sortby=name', 'name', ]);
}

lib/CGI/Widget/DBI/Search/Display/TEST/Grid.pm  view on Meta::CPAN

    $ws->{-max_results_per_page} = 2;
    $ws->{-sql_table} = 'widgets';
    $ws->{-sql_retrieve_columns} = [qw/widget_no name description size/];

    $ws->search();

    $self->assert_display_contains(
        [ 'At first page', '2', 'results displayed', '1 - 2', 'of', '4', 'Next &gt', 'Last &gt' ],
        [ 'tr', 'td' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr' ],
        [ 'At first page', 'Next &gt', 'Last &gt' ],
    );
    $self->assert_display_does_not_contain([ 'Sort by', 'sortby_columns_popup' ]);
    $self->assert_display_does_not_contain([ 'Sort field' ]);
    $self->assert_display_does_not_contain([ 'sortby=widget_no', 'widget_no' ]);
    $self->assert_display_does_not_contain([ 'sortby=name', 'name', ]);


    # reset search

lib/CGI/Widget/DBI/Search/Display/TEST/Table.pm  view on Meta::CPAN


sub test_search__basic
{
    my $self = shift;
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'At first page', 'At last page' ],
        [ map {("sortby=$_", $_)} qw/widget_no name description size/ ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'At first page', 'At last page' ],
    );
}

sub test_search__display_only_subset_of_columns
{
    my $self = shift;
    $self->{ws}->{-display_columns} = { map {$_ => $_} qw/widget_no name size/ };
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'At first page', 'At last page' ],
        [ map {("sortby=$_", $_)} qw/widget_no name size/ ],
        [ 1, 'clock_widget', 'small' ],
        [ 2, 'calendar_widget', 'medium' ],
        [ 3, 'silly_widget', 'unknown' ],
        [ 4, 'gps_widget', 'medium' ],
        [ 'At first page', 'At last page' ],
    );
    $self->assert_display_does_not_contain( [ 'description' ] );
    $self->assert_display_does_not_contain( [ 'A time keeper widget', ] );
    $self->assert_display_does_not_contain( [ 'A date tracker widget', ] );
    $self->assert_display_does_not_contain( [ 'A goofball widget', ] );
}

lib/CGI/Widget/DBI/Search/Display/TEST/Table.pm  view on Meta::CPAN

        my_header1 => sub { my ($self, $row) = @_; return "Widget #".$row->{widget_no}; },
        my_header2 => sub { my ($self, $row) = @_; return "Widget Size: ".$row->{size}; },
        my_header3 => sub { return "***"; },
    };
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'At first page', 'At last page' ],
        [ 'my_header1', (map {("sortby=$_", $_)} qw/widget_no name description size/), qw/my_header2 my_header3/ ],
        [ 'Widget #1', 1, 'clock_widget', 'A time keeper widget', 'small', 'Widget Size: small', '">\*\*\*</', ],
        [ 'Widget #2', 2, 'calendar_widget', 'A date tracker widget', 'medium', 'Widget Size: medium', '">\*\*\*</', ],
        [ 'Widget #3', 3, 'silly_widget', 'A goofball widget', 'unknown', 'Widget Size: unknown', '">\*\*\*</', ],
        [ 'Widget #4', 4, 'gps_widget', 'A GPS widget', 'medium', 'Widget Size: medium', '">\*\*\*</', ],
        [ 'At first page', 'At last page' ],
    );
}

sub test_search__display_with_custom_column_align
{
    my $self = shift;
    $self->{ws}->{-column_align} = { widget_no => 'right', name => 'center' };
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'At first page', 'At last page' ],
        [ 'align="right', 'sortby=widget_no', 'widget_no' ],
        [ 'align="center', 'sortby=name', 'name' ],
        [ 'sortby=description', 'description' ],
        [ 'sortby=size', 'size' ],

        [ 'align="right', 1, 'align="center', 'clock_widget',    'align="left', 'A time keeper widget',  'align="left', 'small'   ],
        [ 'align="right', 2, 'align="center', 'calendar_widget', 'align="left', 'A date tracker widget', 'align="left', 'medium'  ],
        [ 'align="right', 3, 'align="center', 'silly_widget',    'align="left', 'A goofball widget',     'align="left', 'unknown' ],
        [ 'align="right', 4, 'align="center', 'gps_widget',      'align="left', 'A GPS widget',          'align="left', 'medium'  ],

        [ 'At first page', 'At last page' ],
    );

}

sub test_search__with_a_join
{
    my $self = shift;
    $self->SUPER::test_search__with_a_join;

    $self->assert_display_contains(
        [ 'At first page', 'At last page' ],
        [ map {("sortby=$_", $_)} qw/widget_no name description size tool_no tool_name type/ ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small', 2, 'wrench', 'hand' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small', 1, 'hammer', 'hand' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium', 5, 'emacs', 'software' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium', 6, 'apache', 'software' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown', 4, 'rm', 'unix' ],
        [ 'At first page', 'At last page' ],
    );
}

sub test_search__with_a_filter
{
    my $self = shift;
    $self->SUPER::test_search__with_a_filter;

    # only displays most recent filter
    $self->assert_display_contains(
        [ 'At first page', 'At last page' ],
        [ map {("sortby=$_", $_)} qw/widget_no name description size/ ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'At first page', 'At last page' ],
    );
}

sub test_search__paging
{
    my $self = shift;
    $self->SUPER::test_search__paging;

    # only displays most recent page of search

lib/CGI/Widget/DBI/Search/Display/TEST/Table.pm  view on Meta::CPAN

{
    my $self = shift;
    $self->SUPER::test_search__sorting;

    # only displays most recent sorting
    $self->assert_display_contains(
        [ 'At first page', 'At last page' ],
        [ "sortby=widget_no&amp;sort_reverse=0", "widget_no", (map {("sortby=$_", $_)} qw/name description size/) ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 'At first page', 'At last page' ],
    );
}

sub test_search__sorting__supports_href_and_form_extra_vars
{
    my $self = shift;
    my $ws = $self->{ws};

lib/CGI/Widget/DBI/Search/Display/TEST/Table.pm  view on Meta::CPAN

    $ws->{-href_extra_vars} = { href_testvar => undef };
    $ws->{-form_extra_vars} = { form_hiddenvar => undef };
    $ws->search();

    # only displays most recent sorting
    $self->assert_display_contains(
        [ 'input type="hidden" name="form_hiddenvar" value="bar' ],
        [ 'At first page', 'At last page' ],
        [ "sortby=widget_no&amp;href_testvar=foo", "widget_no", (map {("sortby=$_", $_)} qw/name description size/) ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'At first page', 'At last page' ],
    );
}

sub test_search__sorting_in_action_uri_js_function_mode__supports_href_and_form_extra_vars
{
    my $self = shift;
    my $ws = $self->{ws};

lib/CGI/Widget/DBI/Search/Display/TEST/Table.pm  view on Meta::CPAN

    $ws->{-form_extra_vars} = { form_hiddenvar => undef };
    $ws->{-action_uri_js_function} = 'myCustomFunc';
    $ws->search();

    # only displays most recent sorting
    $self->assert_display_contains(
        [ 'input type="hidden" name="form_hiddenvar" value="bar' ],
        [ 'At first page', 'At last page' ],
        [ map { ("\QmyCustomFunc({ 'sortby': '$_', 'href_testvar': 'foo' });\E.*", $_) } qw/widget_no name description size/ ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'At first page', 'At last page' ],
    );
}

sub test_search__paging_and_sorting_together
{
    my $self = shift;
    $self->SUPER::test_search__paging_and_sorting_together;

lib/CGI/Widget/DBI/Search/Display/TEST/Table.pm  view on Meta::CPAN


    $self->_setup_test_search__sorting();
    $ws->{q}->param('sortby', 'widget_no');

    $ws->{-unsortable_columns} = {size => 1};
    $ws->search();

    $self->assert_display_contains(
        [ "sortby=widget_no&amp;sort_reverse=1", "widget_no", (map {("sortby=$_", $_)} qw/name description/) ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
    );
    $self->assert_display_does_not_contain([ 'sortby=size' ]);

    # reset and search again
    $self->init_test_object();
    $self->_setup_test_search__sorting();
    $ws = $self->{ws};
    $ws->{q}->param('sortby', 'widget_no');
    $ws->{q}->param('sort_reverse', 1);

    $ws->{-sortable_columns} = {widget_no => 1, name => 1};
    $ws->search();

    $self->assert_display_contains(
        [ "sortby=widget_no&amp;sort_reverse=0", "widget_no", "sortby=name" ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
    );
    $self->assert_display_does_not_contain([ 'sortby=description' ]);
    $self->assert_display_does_not_contain([ 'sortby=size' ]);
}

sub test_search__default_orderby_and_sorting
{
    my $self = shift;
    $self->SUPER::test_search__default_orderby_and_sorting;

    # only displays most recent sorting
    $self->assert_display_contains(
        [ 'At first page', 'At last page' ],
        [ (map {("sortby=$_", $_)} qw/widget_no name description/), "sortby=size&amp;sort_reverse=1", "size" ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 'At first page', 'At last page' ],
    );
}

sub test_search__css_options
{
    my $self = shift;

lib/CGI/Widget/DBI/Search/Display/TEST/Table.pm  view on Meta::CPAN


    $self->assert_display_contains(
        [ 'At first page', 'At last page' ],
        [ 'table [^<>]*class="TestTableClass' ],
        [ 'thead', 'tr [^<>]*class="TestTableHeaderRowClass', 'th [^<>]*class="TestTableHeaderCellClass' ],
        [ map {("sortby=$_", $_)} qw/widget_no name description size/ ],
        [ 'th', 'tr', 'thead' ],
        [ 'tbody', 'tr [^<>]*class="TestTableRowClass clickable', 'id="TestTableRow_1', 'td [^<>]*class="TestTableCellClass' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 'td', 'tr', 'tr [^<>]*class="TestTableRowClass clickable', 'id="TestTableRow_2', 'td [^<>]*class="TestTableCellClass' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr', 'tr [^<>]*class="TestTableRowClass clickable', 'id="TestTableRow_3', 'td [^<>]*class="TestTableCellClass' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 'td', 'tr', 'tr [^<>]*class="TestTableRowClass clickable', 'id="TestTableRow_4', 'td [^<>]*class="TestTableCellClass' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'td', 'tr', 'tbody', 'table' ],
        [ 'At first page', 'At last page' ],
    );
}

sub test_search__extra_attributes

lib/CGI/Widget/DBI/Search/Display/TEST/Table.pm  view on Meta::CPAN

    my $self = shift;
    $self->{ws}->{-extra_table_cell_attributes} = { test_attr1 => 'foo', test_attr2 => 'bar' };
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'table' ],
        [ map {("sortby=$_", $_)} qw/widget_no name description size/ ],
        [ 'tr', 'td [^<>]*test-attr(?:2="bar"|1="foo") [^<>]*test-attr(?:2="bar"|1="foo")[^<>]*>' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 'td', 'tr', 'tr', 'td [^<>]*test-attr(?:2="bar"|1="foo") [^<>]*test-attr(?:2="bar"|1="foo")[^<>]*>' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td [^<>]*test-attr(?:2="bar"|1="foo") [^<>]*test-attr(?:2="bar"|1="foo")[^<>]*>' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 'td', 'tr', 'tr', 'td [^<>]*test-attr(?:2="bar"|1="foo") [^<>]*test-attr(?:2="bar"|1="foo")[^<>]*>' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'td', 'tr' ],
    );
}

sub test_search__extra_attributes_closure
{

lib/CGI/Widget/DBI/Search/Display/TEST/Table.pm  view on Meta::CPAN

        my $col2 = $obj->{'header_columns'}->[1];
        return { 'attr_'.$col1 => $row->{$col1}, 'attr_'.$col2 => $row->{$col2} };
    };
    $self->SUPER::test_search__basic;

    $self->assert_display_contains(
        [ 'table' ],
        [ map {("sortby=$_", $_)} qw/widget_no name description size/ ],
        [ 'tr', 'td [^<>]*attr-(?:widget-no="1"|name="clock_widget") [^<>]*attr-(?:widget-no="1"|name="clock_widget")[^<>]*>' ],
        [ 1, 'clock_widget', 'A time keeper widget', 'small' ],
        [ 'td', 'tr', 'tr', 'td [^<>]*attr-(?:widget-no="2"|name="calendar_widget") [^<>]*attr-(?:widget-no="2"|name="calendar_widget")[^<>]*>' ],
        [ 2, 'calendar_widget', 'A date tracker widget', 'medium' ],
        [ 'td', 'tr', 'tr', 'td [^<>]*attr-(?:widget-no="3"|name="silly_widget") [^<>]*attr-(?:widget-no="3"|name="silly_widget")[^<>]*>' ],
        [ 3, 'silly_widget', 'A goofball widget', 'unknown' ],
        [ 'td', 'tr', 'tr', 'td [^<>]*attr-(?:widget-no="4"|name="gps_widget") [^<>]*attr-(?:widget-no="4"|name="gps_widget")[^<>]*>' ],
        [ 4, 'gps_widget', 'A GPS widget', 'medium' ],
        [ 'td', 'tr' ],
    );
}


1;

lib/CGI/Widget/DBI/TEST/Search.pm  view on Meta::CPAN

    my $self = shift;
    my $ws = $self->{ws};

    $ws->{-sql_table} = 'widgets';
    $ws->{-sql_retrieve_columns} = [qw/widget_no name description size/];

    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 1, name => 'clock_widget',    description => "A time keeper widget",  size => 'small',   },
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',  },
        { widget_no => 3, name => 'silly_widget',    description => "A goofball widget",     size => 'unknown', },
        { widget_no => 4, name => 'gps_widget',      description => "A GPS widget",          size => 'medium',  },
    ], $ws->{'results'});
    $self->assert_equals(4, $ws->{'numresults'});
}

sub test_search__with_a_join
{
    my $self = shift;
    my $ws = $self->{ws};

lib/CGI/Widget/DBI/TEST/Search.pm  view on Meta::CPAN

    $ws->{-sql_retrieve_columns} =
      [qw/w.widget_no w.name w.description w.size t.tool_no/, 't.name as tool_name', 't.type'];

    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 1, name => 'clock_widget', description => "A time keeper widget", size => 'small',
          tool_no => 2, tool_name => 'wrench', type => 'hand', },
        { widget_no => 1, name => 'clock_widget', description => "A time keeper widget", size => 'small',
          tool_no => 1, tool_name => 'hammer', type => 'hand', },
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',
          tool_no => 5, tool_name => 'emacs', type => 'software', },
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',
          tool_no => 6, tool_name => 'apache', type => 'software', },
        { widget_no => 3, name => 'silly_widget', description => "A goofball widget", size => 'unknown',
          tool_no => 4, tool_name => 'rm', type => 'unix', },
    ], $ws->{'results'});
    $self->assert_equals(5, $ws->{'numresults'});
}

sub test_search__with_a_filter
{
    my $self = shift;

lib/CGI/Widget/DBI/TEST/Search.pm  view on Meta::CPAN

    $ws->{-sql_table} = 'widgets';
    $ws->{-sql_retrieve_columns} = [qw/widget_no name description size/];

    $ws->{-where_clause} = 'name LIKE ?';
    $ws->{-bind_params} = ['c%']; # name begins with 'c'

    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 1, name => 'clock_widget',    description => "A time keeper widget",  size => 'small',  },
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium', },
    ], $ws->{'results'});
    $self->assert_equals(2, $ws->{'numresults'});

    # try a different filter
    delete $ws->{'results'}; # need to clear old results or it will just return cached copy
    delete $ws->{'numresults'}; # need to clear old numresults, too or it will just return cached copy
    $ws->{-where_clause} = 'name LIKE ? AND size = ?';
    $ws->{-bind_params} = ['c%', 'medium']; # name begins with 'c' and size is medium

    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium', },
    ], $ws->{'results'});
    $self->assert_equals(1, $ws->{'numresults'});
}

sub test_search__with_join_for_dataset_and_filter
{
    my $self = shift;
    my $ws = $self->{ws};

    my $setup = sub {

lib/CGI/Widget/DBI/TEST/Search.pm  view on Meta::CPAN

        $ws->{-bind_params} = ['unknown'];

        $ws->{-max_results_per_page} = 2;
    };
    $setup->($ws);

    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 1, name => 'clock_widget',    description => "A time keeper widget",  size => 'small'  },
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium' },
    ], $ws->{'results'});
    $self->assert_equals(3, $ws->{'numresults'});
    # TODO: what happens with an -sql_join_for_dataset that increases the row count?? test this

    # reset search
    $self->init_test_object();
    $ws = $self->{ws};
    $setup->($ws);

    $ws->{q}->param('search_startat', 1); # next page

lib/CGI/Widget/DBI/TEST/Search.pm  view on Meta::CPAN


    # reset search
    $self->init_test_object();
    $self->_setup_test_search__paging();
    $ws = $self->{ws};

    $ws->{q}->param('search_startat', 1);
    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',
          tool_no => 5, tool_name => 'emacs', type => 'software', },
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',
          tool_no => 6, tool_name => 'apache', type => 'software', },
    ], $ws->{'results'});
    $self->assert_equals(5, $ws->{'numresults'});

    # reset search without re-initializing object (test for running in persistent object environments)
    delete $ws->{'results'};

    $ws->{q}->param('search_startat', 2);
    $ws->search();

lib/CGI/Widget/DBI/TEST/Search.pm  view on Meta::CPAN

sub test_search__sorting
{
    my $self = shift;
    my $ws = $self->{ws};

    $self->_setup_test_search__sorting();
    $ws->{q}->param('sortby', 'description');
    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',  },
        { widget_no => 3, name => 'silly_widget',    description => "A goofball widget",     size => 'unknown', },
        { widget_no => 4, name => 'gps_widget',      description => "A GPS widget",          size => 'medium',  },
        { widget_no => 1, name => 'clock_widget',    description => "A time keeper widget",  size => 'small',   },
    ], $ws->{'results'});
    $self->assert_equals(4, $ws->{'numresults'});

    # reset search
    $self->init_test_object();
    $self->_setup_test_search__sorting();
    $ws->{q}->param('sortby', 'description');
    $ws = $self->{ws};

    $ws->{q}->param('sortby', 'widget_no');
    $ws->{q}->param('sort_reverse', 1);
    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 4, name => 'gps_widget',      description => "A GPS widget",          size => 'medium',  },
        { widget_no => 3, name => 'silly_widget',    description => "A goofball widget",     size => 'unknown', },
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',  },
        { widget_no => 1, name => 'clock_widget',    description => "A time keeper widget",  size => 'small',   },
    ], $ws->{'results'});
    $self->assert_equals(4, $ws->{'numresults'});
}

sub test_search__paging_and_sorting_together
{
    my $self = shift;
    my $ws = $self->{ws};

    $self->_setup_test_search__paging();
    $ws->{q}->param('sortby', 'tool_name');
    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',
          tool_no => 6, tool_name => 'apache', type => 'software', },
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',
          tool_no => 5, tool_name => 'emacs', type => 'software', },
    ], $ws->{'results'});
    $self->assert_equals(5, $ws->{'numresults'});

    # reset search
    $self->init_test_object();
    $self->_setup_test_search__paging();
    $ws = $self->{ws};

    $ws->{q}->param('sortby', 'tool_name');

lib/CGI/Widget/DBI/TEST/Search.pm  view on Meta::CPAN


sub test_search__default_orderby_and_sorting
{
    my $self = shift;
    my $ws = $self->{ws};

    $self->_setup_test_search__default_orderby_and_sorting();
    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',  },
        { widget_no => 1, name => 'clock_widget',    description => "A time keeper widget",  size => 'small',   },
        { widget_no => 4, name => 'gps_widget',      description => "A GPS widget",          size => 'medium',  },
        { widget_no => 3, name => 'silly_widget',    description => "A goofball widget",     size => 'unknown', },
    ], $ws->{'results'});
    $self->assert_equals(4, $ws->{'numresults'});

    # reset search
    $self->init_test_object();
    $self->_setup_test_search__default_orderby_and_sorting();
    $ws = $self->{ws};

    $ws->{q}->param('sortby', 'widget_no');
    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 1, name => 'clock_widget',    description => "A time keeper widget",  size => 'small',   },
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',  },
        { widget_no => 3, name => 'silly_widget',    description => "A goofball widget",     size => 'unknown', },
        { widget_no => 4, name => 'gps_widget',      description => "A GPS widget",          size => 'medium',  },
    ], $ws->{'results'});
    $self->assert_equals(4, $ws->{'numresults'});

    # reset search
    $self->init_test_object();
    $self->_setup_test_search__default_orderby_and_sorting();
    $ws = $self->{ws};

    $ws->{q}->param('sortby', 'size');
    $ws->{q}->param('sort_reverse', 1);
    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 3, name => 'silly_widget',    description => "A goofball widget",     size => 'unknown', },
        { widget_no => 1, name => 'clock_widget',    description => "A time keeper widget",  size => 'small',   },
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',  },
        { widget_no => 4, name => 'gps_widget',      description => "A GPS widget",          size => 'medium',  },
    ], $ws->{'results'});
    $self->assert_equals(4, $ws->{'numresults'});

    # reset search
    $self->init_test_object();
    $self->_setup_test_search__default_orderby_and_sorting();
    $ws = $self->{ws};

    $ws->{q}->param('sortby', 'size');
    $ws->{q}->param('sort_reverse', 0);
    $ws->search();

    $self->assert_deep_equals([
        { widget_no => 2, name => 'calendar_widget', description => "A date tracker widget", size => 'medium',  },
        { widget_no => 4, name => 'gps_widget',      description => "A GPS widget",          size => 'medium',  },
        { widget_no => 1, name => 'clock_widget',    description => "A time keeper widget",  size => 'small',   },
        { widget_no => 3, name => 'silly_widget',    description => "A goofball widget",     size => 'unknown', },
    ], $ws->{'results'});
    $self->assert_equals(4, $ws->{'numresults'});
}

sub test_display_results
{
    my $self = shift;
    my $ws = $self->{ws};
    $ws->{-display_columns} =
      { widget_no => 'ID', name => 'Name', description => 'Description', size => '' };
    $ws->{-sql_table} = 'widgets';
    $ws->{-sql_retrieve_columns} = [qw/widget_no name description size/];
    $ws->search();

    $self->assert_display_contains(
        [ 'ID', 'Name',            'Description'            ],
        [    1, 'clock_widget',    'A time keeper widget',  'small'   ],
        [    2, 'calendar_widget', 'A date tracker widget', 'medium'  ],
        [    3, 'silly_widget',    'A goofball widget',     'unknown' ],
    );

    # reset search, set default ordering, and hide 'size' column
    $self->init_test_object();
    $ws = $self->{ws};
    $ws->{-default_orderby_columns} = [qw/name widget_no/];
    $ws->{-display_columns} =
      { widget_no => 'ID', name => 'Name', description => 'Description', size => undef };
    $ws->{-sql_table} = 'widgets';
    $ws->{-sql_retrieve_columns} = [qw/widget_no name description size/];
    $ws->search();

    $self->assert_display_contains(
        [ 'ID', 'Name',            'Description'           ],
        [    2, 'calendar_widget', 'A date tracker widget' ],
        [    1, 'clock_widget',    'A time keeper widget'  ],
        [    3, 'silly_widget',    'A goofball widget'     ],
    );
    $self->assert_display_does_not_contain([ 'medium' ]);
    $self->assert_display_does_not_contain([ 'small' ]);
    $self->assert_display_does_not_contain([ 'unknown' ]);
}


1;

lib/CGI/Widget/DBI/TEST/TestCase.pm  view on Meta::CPAN

DDL3
    return @schemas;
}

sub _insert_test_data {
    my ($self) = @_;
    my $sth1 = $self->{-dbh}->prepare_cached('insert into widgets (widget_no, name, description, size) values (?, ?, ?, ?)');
    my $sth2 = $self->{-dbh}->prepare_cached('insert into tools (tool_no, name, type) values (?, ?, ?)');
    my $sth3 = $self->{-dbh}->prepare_cached('insert into widget_tools (widget_no, tool_no) values (?, ?)');
    $sth1->execute(1, 'clock_widget', "A time keeper widget", 'small');
    $sth1->execute(2, 'calendar_widget', "A date tracker widget", 'medium');
    $sth1->execute(3, 'silly_widget', "A goofball widget", 'unknown');
    $sth1->execute(4, 'gps_widget', "A GPS widget", 'medium');
    $sth2->execute(1, 'hammer', 'hand');
    $sth2->execute(2, 'wrench', 'hand');
    $sth2->execute(3, 'ls', 'unix');
    $sth2->execute(4, 'rm', 'unix');
    $sth2->execute(5, 'emacs', 'software');
    $sth2->execute(6, 'apache', 'software');
    $sth3->execute(1, 2);
    $sth3->execute(1, 1);
    $sth3->execute(2, 5);
    $sth3->execute(2, 6);
    $sth3->execute(3, 4);

    $self->assert_table_contents_equal(
        'widgets', [qw/widget_no name description size/],
        [
            [ 1, 'clock_widget', "A time keeper widget", 'small', ],
            [ 2, 'calendar_widget', "A date tracker widget", 'medium', ],
            [ 3, 'silly_widget', "A goofball widget", 'unknown', ],
            [ 4, 'gps_widget', "A GPS widget", 'medium', ],
        ],
    );
    $self->assert_table_contents_equal(
        'tools', [qw/tool_no name type/],
        [
            [ 1, 'hammer', 'hand', ],
            [ 2, 'wrench', 'hand', ],
            [ 3, 'ls', 'unix', ],



( run in 1.063 second using v1.01-cache-2.11-cpan-5dc5da66d9d )