[Jifty-commit] r4502 - in jifty/branches/virtual-models: . lib/Jifty/Model t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels

jifty-commit at lists.jifty.org jifty-commit at lists.jifty.org
Tue Nov 20 14:01:06 EST 2007


Author: sterling
Date: Tue Nov 20 14:01:05 2007
New Revision: 4502

Added:
   jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Test.pm
   jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/second-run.pl
   jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/second-run.t
Modified:
   jifty/branches/virtual-models/   (props changed)
   jifty/branches/virtual-models/lib/Jifty/Model/ModelClass.pm
   jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Bootstrap.pm
   jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/bootstrap.t

Log:
 r14132 at dynpc145:  andrew | 2007-11-20 13:00:48 -0600
 Fixing an issue where subsequent loads of database-backed models may fail to build collection reference accessors correctly.


Modified: jifty/branches/virtual-models/lib/Jifty/Model/ModelClass.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty/Model/ModelClass.pm	(original)
+++ jifty/branches/virtual-models/lib/Jifty/Model/ModelClass.pm	Tue Nov 20 14:01:05 2007
@@ -163,6 +163,13 @@
     $column->refers_to( $col->refers_to_class ) if $col->refers_to_class;
     $column->by( $col->refers_to_by ) if $col->refers_to_by;
 
+    # Try to load a collection reference ahead of time to make sure it gets
+    # proper handling when the methods are generated
+    if (defined $column->refers_to
+            and $column->refers_to =~ /::([^\.]+)Collection$/) {
+        $column->refers_to->require;
+    }
+
     $column->default( $col->default_value );
     $column->distinct( $col->distinct_value ) if $col->distinct_value;
     $column->type( $col->storage_type ) if $col->storage_type;

Modified: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Bootstrap.pm
==============================================================================
--- jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Bootstrap.pm	(original)
+++ jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Bootstrap.pm	Tue Nov 20 14:01:05 2007
@@ -5,16 +5,33 @@
 
 sub run { 
     my $user = TestApp::DatabaseBackedModels::CurrentUser->new( _bootstrap => 1);
-    my $modelclass = Jifty::Model::ModelClass->new(current_user => $user);
-    $modelclass->create( name => 'Widget');
 
-    my $col = Jifty::Model::ModelClassColumn->new(current_user => $user);
-    $col->create( name => 'name', label_text => 'Name', storage_type => 'text', hints => 'This is the widget name', model_class => $modelclass);
-       my $col2 = Jifty::Model::ModelClassColumn->new(current_user => $user);
-    $col2->create( name => 'inventory', label_text => 'Inventory', storage_type => 'int', hints => 'How many do we have on hand?', model_class => $modelclass);
+    my $warehouse_model = Jifty::Model::ModelClass->new(current_user => $user);
+    $warehouse_model->create( name => 'Warehouse' );
+
+    my $location_col = Jifty::Model::ModelClassColumn->new(current_user => $user);
+    $location_col->create( name => 'location', label_text => 'Location', storage_type => 'text', hints => 'This is the name of this location', model_class => $warehouse_model);
+
+    my $widget_model = Jifty::Model::ModelClass->new(current_user => $user);
+    $widget_model->create( name => 'Widget');
+
+    my $name_col = Jifty::Model::ModelClassColumn->new(current_user => $user);
+    $name_col->create( name => 'name', label_text => 'Name', storage_type => 'text', hints => 'This is the widget name', model_class => $widget_model);
+
+    my $inventory_col = Jifty::Model::ModelClassColumn->new(current_user => $user);
+    $inventory_col->create( name => 'inventory', label_text => 'Inventory', storage_type => 'int', hints => 'How many do we have on hand?', model_class => $widget_model);
+
+    my $warehouse_col = Jifty::Model::ModelClassColumn->new(current_user => $user);
+    $warehouse_col->create( name => 'warehouse', label_text => 'Warehouse', refers_to_class => 'TestApp::DatabaseBackedModels::Model::Warehouse', model_class => $widget_model );
+
+    my $widgets_col = Jifty::Model::ModelClassColumn->new(current_user => $user);
+    $widgets_col->create( name => 'widgets', refers_to_class => 'TestApp::DatabaseBackedModels::Model::WidgetCollection', refers_to_by => 'warehouse', model_class => $warehouse_model );
+
+    my $warehouse = TestApp::DatabaseBackedModels::Model::Warehouse->new(current_user => $user);
+    $warehouse->create(location => 'Manhattan');
 
     my $widget = TestApp::DatabaseBackedModels::Model::Widget->new(current_user => $user);
-    $widget->create(name => 'Weeble', inventory => 6);
+    $widget->create(name => 'Weeble', inventory => 6, warehouse => $warehouse);
 
 };
 

Added: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Test.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Test.pm	Tue Nov 20 14:01:05 2007
@@ -0,0 +1,68 @@
+use strict;
+use warnings;
+
+package TestApp::DatabaseBackedModels::Test;
+
+use lib '../../lib';
+
+use Jifty::Test ();
+use base qw/ Jifty::Test /;
+
+use File::Path;
+
+=head1 DESCRIPTION
+
+Used as part of the F<second-run.t> test to make sure that the database is not bootstrapped again so that we can use a database that's already been bootstrapped in a previous run of Jifty.
+
+=cut
+
+sub setup {
+    my $class = shift;
+
+    my $test_config = File::Temp->new( UNLINK => 0 );
+    Jifty::YAML::DumpFile("$test_config", $class->test_config(Jifty::Config->new));
+    # Invoking bin/jifty and friends will now have the test config ready.
+    $ENV{'JIFTY_TEST_CONFIG'} ||= "$test_config";
+    $class->builder->{test_config} = $test_config;
+    {
+        # Cache::Memcached stores things. And doesn't let them expire
+        # from the cache easily. This is fine in production, but
+        # during testing each test script needs its own namespace.  we
+        # use the pid of the current process, and save it so the keys
+        # stays the same when we fork
+      {
+          package Jifty::Record;
+          no warnings qw/redefine/;
+
+          use vars qw/$cache_key_prefix/;
+
+          $cache_key_prefix = "jifty-test-" . $$;
+        
+          sub cache_key_prefix {
+              $Jifty::Record::cache_key_prefix;
+          }
+      }
+        
+    }
+    my $root = Jifty::Util->app_root;
+
+    # Mason's disk caching sometimes causes false tests
+    rmtree([ File::Spec->canonpath("$root/var/mason") ], 0, 1);
+
+    Jifty->new;
+
+    $class->setup_mailbox;
+}
+
+sub _testfile_to_dbname {
+    my $dbname = 'ppdatabasebackedmodelstsecondrun';
+    if (-f "testapp_databasebackedmodels".$dbname) {
+        return $dbname;
+    }
+    else {
+        Test::More::diag(`ls `);
+        die "Database does not exist: $dbname";
+    }
+}
+
+1;

Modified: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/bootstrap.t
==============================================================================
--- jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/bootstrap.t	(original)
+++ jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/bootstrap.t	Tue Nov 20 14:01:05 2007
@@ -12,7 +12,7 @@
 use lib 't/lib';
 use Jifty::SubTest;
 
-use Jifty::Test tests => 11;
+use Jifty::Test tests => 27;
 
 ok(1, "Loaded the test script");
 
@@ -26,6 +26,8 @@
 can_ok($object, 'create');
 can_ok($object, 'name');
 can_ok($object, 'set_name');
+can_ok($object, 'warehouse');
+can_ok($object, 'set_warehouse');
 
 my $id = $object->create( name => 'Widget');
 ok($id, "Created id ".$id);
@@ -35,5 +37,28 @@
 $object_clone->load($id);
 is($object_clone->name, 'Widget');
 
+my $warehouse = TestApp::DatabaseBackedModels::Model::Warehouse->new(current_user => $u);
+isa_ok($warehouse, 'TestApp::DatabaseBackedModels::Model::Warehouse');
+isa_ok($warehouse, 'TestApp::DatabaseBackedModels::Record');
+can_ok($warehouse, 'id');
+can_ok($warehouse, 'location');
+can_ok($warehouse, 'set_location');
+can_ok($warehouse, 'widgets');
+
+$warehouse->load_by_cols( location => 'Manhattan' );
+ok($warehouse->id);
+is($warehouse->location, 'Manhattan');
+
+my $widgets = $warehouse->widgets;
+isa_ok($widgets, 'TestApp::DatabaseBackedModels::Model::WidgetCollection');
+my $widget = $widgets->next;
+ok($widget->id);
+is($widget->name, 'Weeble');
+is($widget->inventory, 6);
+is($widget->warehouse->id, $warehouse->id);
+
+$widget = $widgets->next;
+is($widget, undef);
+
 1;
 

Added: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/second-run.pl
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/second-run.pl	Tue Nov 20 14:01:05 2007
@@ -0,0 +1,64 @@
+#!/usr/bin/env perl
+
+use warnings;
+use strict;
+
+=head1 DESCRIPTION
+
+Run tests with a fresh new Jifty.
+
+=cut
+
+use lib 't/lib';
+use Jifty::SubTest;
+
+use TestApp::DatabaseBackedModels::Test tests => 27;
+
+ok(1, "Loaded the test script");
+
+can_ok('TestApp::DatabaseBackedModels::Model::Widget', 'new');
+
+my $u = Jifty::CurrentUser->new(_bootstrap => 1);
+my $object = TestApp::DatabaseBackedModels::Model::Widget->new(current_user => $u);
+isa_ok($object, 'TestApp::DatabaseBackedModels::Model::Widget');
+isa_ok($object, 'TestApp::DatabaseBackedModels::Record');
+can_ok($object, 'id');
+can_ok($object, 'create');
+can_ok($object, 'name');
+can_ok($object, 'set_name');
+can_ok($object, 'warehouse');
+can_ok($object, 'set_warehouse');
+
+my $id = $object->create( name => 'Widget');
+ok($id, "Created id ".$id);
+is($id,$object->id);
+my $object_clone = TestApp::DatabaseBackedModels::Model::Widget->new(current_user => $u);
+
+$object_clone->load($id);
+is($object_clone->name, 'Widget');
+
+my $warehouse = TestApp::DatabaseBackedModels::Model::Warehouse->new(current_user => $u);
+isa_ok($warehouse, 'TestApp::DatabaseBackedModels::Model::Warehouse');
+isa_ok($warehouse, 'TestApp::DatabaseBackedModels::Record');
+can_ok($warehouse, 'id');
+can_ok($warehouse, 'location');
+can_ok($warehouse, 'set_location');
+can_ok($warehouse, 'widgets');
+
+$warehouse->load_by_cols( location => 'Manhattan' );
+ok($warehouse->id);
+is($warehouse->location, 'Manhattan');
+
+my $widgets = $warehouse->widgets;
+isa_ok($widgets, 'TestApp::DatabaseBackedModels::Model::WidgetCollection');
+my $widget = $widgets->next;
+ok($widget->id);
+is($widget->name, 'Weeble');
+is($widget->inventory, 6);
+is($widget->warehouse->id, $warehouse->id);
+
+$widget = $widgets->next;
+is($widget, undef);
+
+1;
+

Added: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/second-run.t
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/second-run.t	Tue Nov 20 14:01:05 2007
@@ -0,0 +1,26 @@
+#!/usr/bin/env perl
+
+use warnings;
+use strict;
+
+=head1 DESCRIPTION
+
+This test performs some magic to start Jifty up a second time after Jifty::Test performs initialization. This is so we can cover additional hunks of code that have to do with the bootstrapping process on an existing Jifty database (i.e., building database-backed tables that were stored in a previous instance of the Jifty application that has now closed).
+
+This is moderately ugly. Jifty::Test might might be modif
+
+=cut
+
+use lib 't/lib';
+use Jifty::SubTest;
+
+use Jifty::Test;
+
+if (my $pid = fork) {
+    waitpid($pid, 0);
+}
+
+else {
+    chdir '../..';
+    exec 'perl t/TestApp-DatabaseBackedModels/t/second-run.pl';
+}


More information about the Jifty-commit mailing list