The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package RTest::UI::ViewPort::ListView;

use base qw/Reaction::Test::WithDB/;
use Reaction::Class;

use Reaction::UI::ViewPort::ListView;
use RTest::TestDB;
use Test::More ();

has '+schema_class' => (default => sub { 'RTest::TestDB' });

has 'viewport' => (
  isa => 'Reaction::UI::ViewPort::ListView',
  is => 'rw', set_or_lazy_build('viewport'),
  clearer => 'clear_viewport',
);

has 'collection' => (
  isa => 'DBIx::Class::ResultSet',
  is => 'rw', set_or_lazy_build('collection'),
  clearer => 'clear_collection',
);

sub build_collection {
  shift->schema->resultset('Foo');
}

sub build_viewport {
  my ($self) = @_;
  my $vp = Reaction::UI::ViewPort::ListView->new(
    location => 0,
    collection => $self->collection,
    ctx => $self->simple_mock_context,
    column_order => [qw(id first_name last_name)],
  );
  return $vp;
}

sub null_test :Tests {
  my ($self) = @_;
  Test::More::ok(1, 'placeholder test');
}

sub init_viewport :Tests {
  my ($self) = @_;

  return "Skip as these all fail";

  $self->clear_viewport;

  Test::More::cmp_ok($self->viewport->page, '==', 1, "Default page");
  Test::More::cmp_ok($self->viewport->per_page, '==', 10, "Default per page");

  my @columns = qw(id first_name last_name);
  Test::More::is_deeply($self->viewport->field_names, \@columns, "Field names");
  Test::More::is($self->viewport->field_label('first_name'), 'First Name', 'Field label');

  my @rows = $self->viewport->current_rows;
  Test::More::cmp_ok(@rows, '==', 10, 'Row count');
  Test::More::isa_ok($rows[0], 'RTest::TestDB::Foo', 'First row class');
  Test::More::cmp_ok($rows[0]->id, '==', 1, 'First row id');

  my $pager = $self->viewport->pager;
  Test::More::cmp_ok($pager->current_page, '==', 1, 'Pager current page');
  Test::More::cmp_ok($pager->next_page, '==', 2, 'Pager next page');
  Test::More::ok(!defined($pager->previous_page), 'Pager previous page');
  Test::More::cmp_ok($pager->entries_per_page, '==', 10, 'Pager entries per page');
}

sub modify_viewport :Tests {
  my ($self) = @_;

  return "Skip as these all fail";

  $self->clear_viewport;

  $self->viewport->per_page(20);
  $self->viewport->page(2);

  my $pager = $self->viewport->pager;

  Test::More::cmp_ok($pager->current_page, '==', 2, 'Pager current page');
  Test::More::cmp_ok($pager->last_page, '==', 5, 'Pager last page');
}

sub viewport_to_csv :Tests {
  my ($self) = @_;

  return "Skip as these all fail";

  $self->clear_viewport;

  $self->viewport->export_to_csv;

  Test::More::like($self->viewport->ctx->res->body,
    qr/^Id,"First Name","Last Name"\r
1,Joe,"Bloggs 1"\r
2,John,"Smith 1"\r
3,Joe,"Bloggs 2"\r
4,John,"Smith 2"\r
5,Joe,"Bloggs 3"\r
6,John,"Smith 3"\r
7,Joe,"Bloggs 4"\r
8,John,"Smith 4"\r
9,Joe,"Bloggs 5"\r
10,John,"Smith 5"\r
/, "CSV export head ok");
  Test::More::like($self->viewport->ctx->res->body,
    qr/100,John,"Smith 50"\r\n$/, "CSV export tail ok");

}

1;