The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use strict;
use warnings 'all';
use lib qw( t/lib );
use Test::More 'no_plan';

use_ok('My::State');
use_ok('My::City');
use_ok('My::Zipcode');

my $state = My::State->find_or_create(
  state_name  => 'California',
  state_abbr  => 'CA'
);
my $burbank = My::City->find_or_create(
  state_id    => $state->id,
  city_name   => 'Burbank'
);
my $glendale = My::City->find_or_create(
  state_id    => $state->id,
  city_name   => 'Glendale'
);
my $zip = My::Zipcode->find_or_create(
  city_id   => $burbank->id,
  zipcode   => 91501,
);

is_deeply(
  $zip->city  => $burbank,
  "91501 belongs to Burbank"
);

is_deeply(
  $burbank->zipcode => $zip,
  "Burbank's Zipcode is 91501"
);

$zip->city_id( $glendale->id );
$zip->update;

is_deeply(
  $zip->city  => $glendale,
  "91501 now belongs to Glendale"
);

is_deeply(
  $glendale->zipcode  => $zip,
  "Glendale's Zipcode is now 91510"
);

$zip->city_id( $burbank->id );
$zip->update;


# Now test the new search args allowed in the has_many methods:
CITIES: {
  my ($burbank2) = $state->cities({ city_name => 'Burbank'});
  is_deeply $burbank2, $burbank, "Got Burbank alright";
  
  my ($glendale2) = $state->cities({ city_name => 'Glendale'});
  is_deeply $glendale2, $glendale, "Got Glendale alright";
  
  my ($burbank3) = $state->cities({ city_name => {'!=' => 'Glendale'}});
  is_deeply $burbank3, $burbank, "Got Burbank again";
  
  my ($glendale3) = $state->cities(undef, { order_by => 'city_id DESC LIMIT 0, 1'} );
  is_deeply $glendale3, $glendale, "Got Glendale by id reversed";
};