[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