The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use strict;
use lib ('t/lib');
{
package Test::Resultset;
has '+item_class' => ( default => 'Employer' );
has 'resultset' => ( isa => 'DBIx::Class::ResultSet', is => 'rw', trigger => sub { shift->set_resultset(@_) } );
sub set_resultset {
my ( $self, $resultset ) = @_;
$self->schema( $resultset->result_source->schema );
}
sub init_object {
my $self = shift;
my $rows = [$self->resultset->all];
return { employers => $rows };
}
has_field 'employers' => ( type => 'Repeatable' );
has_field 'employers.employer_id' => ( type => 'PrimaryKey' );
has_field 'employers.name';
has_field 'employers.category';
has_field 'employers.country';
sub update_model {
my $self = shift;
my $values = $self->values->{employers};
foreach my $row (@$values) {
delete $row->{employer_id} unless defined $row->{employer_id};
$self->resultset->update_or_create( $row );
}
}
}
my $schema = BookDB::Schema->connect('dbi:SQLite:t/db/book.db');
my $employers = $schema->resultset('Employer');
my $form = Test::Resultset->new( resultset => $employers );
ok( $form, 'form builds' );
ok( $form->schema, 'form has schema' );
my $fif = {
'employers.0.category' => 'Perl',
'employers.0.country' => 'US',
'employers.0.employer_id' => 1,
'employers.0.name' => 'Best Perl',
'employers.1.category' => 'Programming',
'employers.1.country' => 'UK',
'employers.1.employer_id' => 2,
'employers.1.name' => 'Worst Perl',
'employers.2.category' => 'Programming',
'employers.2.country' => 'DE',
'employers.2.employer_id' => 3,
'employers.2.name' => 'Convoluted PHP',
'employers.3.category' => 'Losing',
'employers.3.country' => 'DE',
'employers.3.employer_id' => 4,
'employers.3.name' => 'Contractor Heaven',
};
is_deeply( $form->fif, $fif, 'fif is correct' );
$fif->{'employers.2.category'} = 'Marketing';
$form->process( params => $fif );
ok( $form->validated, 'form validated' );
is( $form->resultset->find(3)->category, 'Marketing', 'row updated ok' );
$fif->{'employers.2.category'} = 'Programming';
$form->process( params => $fif );
is( $form->resultset->find(3)->category, 'Programming', 'row updated ok' );
done_testing;