add test for literal SQL through accessor
Rafael Kitover [Sat, 21 May 2011 14:24:26 +0000 (10:24 -0400)]
t/05testapp.t
t/09schema_options.t
t/10literal_sql_through_accessor.t [new file with mode: 0644]
t/lib/ASchemaClass/User.pm [new file with mode: 0644]
t/lib/ASchemaClass/Users.pm [deleted file]
t/lib/AnotherSchemaClass/Result/User.pm [new file with mode: 0644]
t/lib/AnotherSchemaClass/Result/Users.pm [deleted file]
t/lib/AnotherSchemaClass/ResultSet/User.pm [moved from t/lib/AnotherSchemaClass/ResultSet/Users.pm with 75% similarity]
t/lib/TestAppC3Fail/Schema/DB/User.pm [new file with mode: 0644]
t/lib/TestAppC3Fail/Schema/DB/Users.pm [deleted file]

index 22fb546..d6facce 100644 (file)
@@ -4,6 +4,7 @@ use FindBin;
 use File::Spec::Functions qw/catfile catdir/;
 use File::Find;
 use Config;
+use DBI;
 
 plan skip_all => 'Enable this optional test with $ENV{C_M_DBIC_SCHEMA_TESTAPP}'
     unless $ENV{C_M_DBIC_SCHEMA_TESTAPP};
@@ -26,7 +27,7 @@ my $catlib_dir = catdir ($cat_dir, 'lib');
 my $schema_dir = catdir ($catlib_dir, 'TestSchemaDSN');
 my $creator    = catfile($cat_dir, 'script', 'testapp_create.pl');
 my $model_dir  = catdir ($catlib_dir, 'TestApp', 'Model');
-my $db         = catdir ($cat_dir, 'testdb.db');
+my $db         = catfile($cat_dir, 'testdb.db');
 
 my $catalyst_pl;
 
@@ -45,8 +46,10 @@ system("$^X $catalyst_pl TestApp");
 chdir($cat_dir);
 
 # create test db
-open my $sql, '|-', "sqlite3 $db" or die $!;
-print $sql <<'EOF';
+my $dbh = DBI->connect("dbi:SQLite:$db", '', '', {
+   RaiseError => 1, PrintError => 0
+});
+$dbh->do(<<'EOF');
 CREATE TABLE users (                       
         id            INTEGER PRIMARY KEY, 
         username      TEXT,                
@@ -56,12 +59,14 @@ CREATE TABLE users (
         last_name     TEXT,                
         active        INTEGER              
 );
+EOF
+$dbh->do(<<'EOF');
 CREATE TABLE roles (
         id   INTEGER PRIMARY KEY,
         role TEXT
 );
 EOF
-close $sql;
+$dbh->disconnect;
 
 foreach my $tparam (@$test_params) {
    my ($model, $helper, @args) = @$tparam;
index af1356c..3a9d98b 100644 (file)
@@ -23,7 +23,7 @@ is $m->schema->a_schema_option, 'pass the crack pipe', 'delegation works';
 
 ok(($m = instance(schema_class => 'AnotherSchemaClass')), 'instance');
 
-is $m->resultset('Users')->rs_config_option, 'configured rs value',
+is $m->resultset('User')->rs_config_option, 'configured rs value',
     'ResultSet option passed from config';
 
 done_testing;
@@ -41,7 +41,7 @@ BEGIN {
     package MyApp;
     use Catalyst;
     __PACKAGE__->config({
-        'Model::DB::Users' => {
+        'Model::DB::User' => {
             rs_config_option => 'configured rs value',
         },
     });
diff --git a/t/10literal_sql_through_accessor.t b/t/10literal_sql_through_accessor.t
new file mode 100644 (file)
index 0000000..0918754
--- /dev/null
@@ -0,0 +1,66 @@
+use strict;
+use warnings;
+use Test::More;
+use Test::Exception;
+use FindBin;
+use lib "$FindBin::Bin/lib";
+use File::Spec::Functions 'catfile';
+use DBI;
+
+my $test_dir = $FindBin::Bin;
+my $db       = catfile($test_dir, 'testdb.db');
+
+my $dbh = DBI->connect("dbi:SQLite:$db", '', '', {
+    RaiseError => 1, PrintError => 0
+});
+
+$dbh->do(<<'EOF');
+create table users (
+    id integer primary key,
+    first_name varchar(100),
+    middle_name varchar(100),
+    last_name varchar(100),
+    email_address varchar(100)
+)
+EOF
+$dbh->disconnect;
+
+my $model = instance();
+my $rs    = $model->resultset('User');
+
+my $row = $rs->create({ first_name => 'Foo', last_name => 'Bar' });
+
+$row->first_name(\['last_name']);
+
+lives_ok {
+    $row->update;
+} 'update survived';
+
+$row->discard_changes;
+
+is $row->first_name, 'Bar',
+    'row updated with literal SQL through accessor';
+
+done_testing;
+
+sub instance {
+    MyApp::Model::DB->COMPONENT('MyApp', {
+        schema_class => 'ASchemaClass',
+        connect_info => ["dbi:SQLite:$db", '', ''],
+        @_,
+    })
+}
+
+{
+    package MyApp;
+    use Catalyst;
+}
+{
+    package MyApp::Model::DB;
+    use base 'Catalyst::Model::DBIC::Schema';
+}
+
+END {
+    $model->storage->disconnect if $model;
+    unlink $db or die "Could not delete $db: $!";
+}
diff --git a/t/lib/ASchemaClass/User.pm b/t/lib/ASchemaClass/User.pm
new file mode 100644 (file)
index 0000000..7b2648c
--- /dev/null
@@ -0,0 +1,24 @@
+package ASchemaClass::User;
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Core';
+
+__PACKAGE__->table("users");
+
+__PACKAGE__->add_columns(
+  "id",
+  { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
+  "first_name",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+  "middle_name",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+  "last_name",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+  "email_address",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+);
+__PACKAGE__->set_primary_key("id");
+
+1;
diff --git a/t/lib/ASchemaClass/Users.pm b/t/lib/ASchemaClass/Users.pm
deleted file mode 100644 (file)
index f1ab4ad..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-package ASchemaClass::Users;
-
-# empty schemas no longer work
-
-use strict;
-use warnings;
-
-use base 'DBIx::Class';
-
-__PACKAGE__->load_components("Core");
-__PACKAGE__->table("users");
-
-1;
diff --git a/t/lib/AnotherSchemaClass/Result/User.pm b/t/lib/AnotherSchemaClass/Result/User.pm
new file mode 100644 (file)
index 0000000..49d7045
--- /dev/null
@@ -0,0 +1,24 @@
+package AnotherSchemaClass::Result::User;
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Core';
+
+__PACKAGE__->table("users");
+
+__PACKAGE__->add_columns(
+  "id",
+  { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
+  "first_name",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+  "middle_name",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+  "last_name",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+  "email_address",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+);
+__PACKAGE__->set_primary_key("id");
+
+1;
diff --git a/t/lib/AnotherSchemaClass/Result/Users.pm b/t/lib/AnotherSchemaClass/Result/Users.pm
deleted file mode 100644 (file)
index cced8ce..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-package AnotherSchemaClass::Result::Users;
-
-# empty schemas no longer work
-
-use strict;
-use warnings;
-
-use base 'DBIx::Class';
-
-__PACKAGE__->load_components("Core");
-__PACKAGE__->table("users");
-
-1;
similarity index 75%
rename from t/lib/AnotherSchemaClass/ResultSet/Users.pm
rename to t/lib/AnotherSchemaClass/ResultSet/User.pm
index f422ff8..c74571b 100644 (file)
@@ -1,4 +1,4 @@
-package AnotherSchemaClass::ResultSet::Users;
+package AnotherSchemaClass::ResultSet::User;
 
 use strict;
 use warnings;
diff --git a/t/lib/TestAppC3Fail/Schema/DB/User.pm b/t/lib/TestAppC3Fail/Schema/DB/User.pm
new file mode 100644 (file)
index 0000000..caa42ac
--- /dev/null
@@ -0,0 +1,24 @@
+package TestAppC3Fail::Schema::DB::User;
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Core';
+
+__PACKAGE__->table("users");
+
+__PACKAGE__->add_columns(
+  "id",
+  { data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
+  "first_name",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+  "middle_name",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+  "last_name",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+  "email_address",
+  { data_type => "varchar", is_nullable => 1, size => 100 },
+);
+__PACKAGE__->set_primary_key("id");
+
+1;
diff --git a/t/lib/TestAppC3Fail/Schema/DB/Users.pm b/t/lib/TestAppC3Fail/Schema/DB/Users.pm
deleted file mode 100644 (file)
index 7683299..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-package TestAppC3Fail::Schema::DB::Users;
-
-# empty schemas no longer work
-
-use strict;
-use warnings;
-
-use base 'DBIx::Class';
-
-__PACKAGE__->load_components("Core");
-__PACKAGE__->table("users");
-
-1;