#------------------------------------------------------------------- # WebGUI is Copyright 2001-2009 Plain Black Corporation. #------------------------------------------------------------------- # Please read the legal notices (docs/legal.txt) and the license # (docs/license.txt) that came with this distribution before using # this software. #------------------------------------------------------------------- # http://www.plainblack.com info@plainblack.com #------------------------------------------------------------------- use FindBin; use strict; use lib "$FindBin::Bin/../../lib"; ##The goal of this test is to test the creation of Thingy Wobjects. use WebGUI::Test; use WebGUI::Session; use Test::More tests => 38; # increment this value for each test you create use Test::Deep; use JSON; use WebGUI::Asset::Wobject::Thingy; use Data::Dumper; my $session = WebGUI::Test->session; # Do our work in the import node my $node = WebGUI::Asset->getImportNode($session); my $templateId = 'THING_EDIT_TEMPLATE___'; my $templateMock = Test::MockObject->new({}); $templateMock->set_isa('WebGUI::Asset::Template'); $templateMock->set_always('getId', $templateId); my $templateVars; $templateMock->mock('process', sub { $templateVars = $_[1]; } ); my $versionTag = WebGUI::VersionTag->getWorking($session); $versionTag->set({name=>"Thingy Test"}); WebGUI::Test->addToCleanup($versionTag); my $thingy = $node->addChild({className=>'WebGUI::Asset::Wobject::Thingy'}); $versionTag->commit; $thingy = $thingy->cloneFromDb; # Test for a sane object type isa_ok($thingy, 'WebGUI::Asset::Wobject::Thingy'); # Test to see if we can set new values my $newThingySettings = { templateId=>'testingtestingtesting1', }; $thingy->update($newThingySettings); foreach my $newSetting (keys %{$newThingySettings}) { is ($thingy->get($newSetting), $newThingySettings->{$newSetting}, "updated $newSetting is ".$newThingySettings->{$newSetting}); } # Test adding a new Thing my $i18n = WebGUI::International->new($session, "Asset_Thingy"); my $groupIdEdit = $thingy->get("groupIdEdit"); my %thingProperties = ( thingId=>"new", label=>$i18n->get('assetName'), editScreenTitle=>$i18n->get('edit screen title label'), editInstructions=>'', groupIdAdd=>$groupIdEdit, groupIdEdit=>$groupIdEdit, saveButtonLabel=>$i18n->get('default save button label'), afterSave=>'searchThisThing', editTemplateId=>"ThingyTmpl000000000003", groupIdView=>$groupIdEdit, viewTemplateId=>"ThingyTmpl000000000002", defaultView=>'searchThing', searchScreenTitle=>$i18n->get('search screen title label'), searchDescription=>'', groupIdSearch=>$groupIdEdit, groupIdExport=>$groupIdEdit, groupIdImport=>$groupIdEdit, searchTemplateId=>"ThingyTmpl000000000004", thingsPerPage=>25, ); my $thingId = $thingy->addThing(\%thingProperties,0); my $isValidId = $session->id->valid($thingId); is($isValidId,1,"addThing returned a valid id: ".$thingId); my $thingTableName = "Thingy_".$thingId; my ($thingTableNameCheck) = $session->db->quickArray("show tables like ".$session->db->quote($thingTableName)); is($thingTableNameCheck,$thingTableName,"An empty table: ".$thingTableName." for the new thing exists."); is($thingy->get('defaultThingId'),$thingId,"The Thingy assets defaultThingId was set correctly."); # Test getting the newly added thing by its thingID as JSON $session->user({userId => 3}); my $json = $thingy->www_getThingViaAjax($thingId); my $dataFromJSON = JSON->new->decode($json); cmp_deeply( $dataFromJSON, { assetId=>$thingy->getId, thingId=>$thingId, label=>$i18n->get('assetName'), editScreenTitle=>$i18n->get('edit screen title label'), editInstructions=>'', groupIdAdd=>$groupIdEdit, groupIdEdit=>$groupIdEdit, saveButtonLabel=>$i18n->get('default save button label'), afterSave=>'searchThisThing', editTemplateId=>"ThingyTmpl000000000003", groupIdView=>$groupIdEdit, viewTemplateId=>"ThingyTmpl000000000002", defaultView=>'searchThing', searchScreenTitle=>$i18n->get('search screen title label'), searchDescription=>'', groupIdSearch=>$groupIdEdit, groupIdExport=>$groupIdEdit, groupIdImport=>$groupIdEdit, searchTemplateId=>"ThingyTmpl000000000004", thingsPerPage=>25, display=>undef, onAddWorkflowId=>undef, onEditWorkflowId=>undef, onDeleteWorkflowId=>undef, sortBy=>undef, field_loop=>[], exportMetaData=>undef, maxEntriesPerUser=>undef, maxEntriesTotal=>undef, }, 'Getting newly added thing as JSON: www_getThingViaAjax returns correct data as JSON.' ); # Test getting all things in this Thingy as JSON, this should be an array containing only # the newly created thing. $json = $thingy->www_getThingsViaAjax(); $dataFromJSON = JSON->new->decode($json); cmp_deeply( $dataFromJSON, [{ assetId=>$thingy->getId, thingId=>$thingId, label=>$i18n->get('assetName'), editScreenTitle=>$i18n->get('edit screen title label'), editInstructions=>'', groupIdAdd=>$groupIdEdit, groupIdEdit=>$groupIdEdit, saveButtonLabel=>$i18n->get('default save button label'), afterSave=>'searchThisThing', editTemplateId=>"ThingyTmpl000000000003", groupIdView=>$groupIdEdit, viewTemplateId=>"ThingyTmpl000000000002", defaultView=>'searchThing', searchScreenTitle=>$i18n->get('search screen title label'), searchDescription=>'', groupIdSearch=>$groupIdEdit, groupIdExport=>$groupIdEdit, groupIdImport=>$groupIdEdit, searchTemplateId=>"ThingyTmpl000000000004", thingsPerPage=>25, display=>undef, onAddWorkflowId=>undef, onEditWorkflowId=>undef, onDeleteWorkflowId=>undef, sortBy=>undef, canEdit=>1, canAdd=>1, canSearch=>1, exportMetaData=>undef, maxEntriesPerUser=>undef, maxEntriesTotal=>undef, }], 'Getting all things in Thingy as JSON: www_getThingsViaAjax returns correct data as JSON.' ); # Test adding a field my %fieldProperties = ( thingId=>$thingId, fieldId=>"new", label=>$i18n->get('assetName')." field", dateCreated=>time(), fieldType=>"textarea", status=>"editable", display=>1, ); my $fieldId = $thingy->addField(\%fieldProperties,0); $isValidId = $session->id->valid($fieldId); is($isValidId,1,"Adding a textarea field: addField returned a valid id: ".$fieldId); my ($fieldLabel, $columnType, $Null, $Key, $Default, $Extra) = $session->db->quickArray("show columns from " .$session->db->dbh->quote_identifier($thingTableName) ." like ".$session->db->quote("Field_".$fieldId)); is($fieldLabel,"field_".$fieldId,"A column for the new field Field_$fieldId exists."); is($columnType,"longtext","The columns is the right type"); # Test duplicating a Thing my $copyThingId = $thingy->duplicateThing($thingId); $isValidId = $session->id->valid($copyThingId); ok($isValidId, "duplicating a Thing: duplicateThing returned a valid id: ".$copyThingId); # Test adding, editing, getting and deleting thing data my ($newThingDataId,$errors) = $thingy->editThingDataSave($thingId,'new',{"field_".$fieldId => 'test value'}); ok( ! $thingy->hasEnteredMaxPerUser($thingId), 'hasEnteredMaxPerUser: returns false when maxEntriesPerUser=0 and 1 entry added'); my $isValidThingDataId = $session->id->valid($newThingDataId); ok($isValidThingDataId, "Adding thing data: editFieldSave returned a valid id: ".$newThingDataId); my $viewThingVars = $thingy->getViewThingVars($thingId,$newThingDataId); cmp_deeply( $viewThingVars->{field_loop}, [{ field_id => $fieldId, field_isHidden => "", field_value => 'test value', field_url => undef, field_name => "field_".$fieldId, field_label => $i18n->get('assetName')." field", field_isRequired => '', field_isVisible => '', field_pretext => undef, field_subtext => undef, field_type => "textarea", }], 'Getting newly added thing data: getViewThingVars returns correct field_loop.' ); $json = $thingy->www_viewThingDataViaAjax($thingId,$newThingDataId); $dataFromJSON = JSON->new->decode($json); cmp_deeply( $dataFromJSON, { field_loop => [{ field_id => $fieldId, field_isHidden => "", field_value => 'test value', field_url => undef, field_name => "field_".$fieldId, field_label => $i18n->get('assetName')." field", field_isRequired => '', field_isVisible => '', field_pretext => undef, field_subtext => undef, field_type => "textarea", }], viewScreenTitle => "", 'Thingy field' => 'test value', }, 'Getting newly added thing data as JSON: www_viewThingDataViaAjax returns correct data as JSON.' ); my ($updatedThingDataId,$errors) = $thingy->editThingDataSave($thingId,$newThingDataId,{"field_".$fieldId => 'new test value'}); my $viewThingVars = $thingy->getViewThingVars($thingId,$newThingDataId); cmp_deeply( $viewThingVars->{field_loop}, [{ field_id => $fieldId, field_isHidden => "", field_value => 'new test value', field_url => undef, field_name => "field_".$fieldId, field_label => $i18n->get('assetName')." field", field_isRequired => '', field_isVisible => '', field_pretext => undef, field_subtext => undef, field_type => "textarea", }], 'Getting updated thing data: getViewThingVars returns correct field_loop with updated value.' ); $thingy->deleteThingData($thingId,$newThingDataId); is($thingy->getViewThingVars($thingId,$newThingDataId),undef,'Thing data was succesfully deleted, getViewThingVars returns undef.'); $json = $thingy->www_viewThingDataViaAjax($thingId,$newThingDataId); $dataFromJSON = JSON->new->decode($json); cmp_deeply( $dataFromJSON, { message => "The thingDataId you requested can not be found.", }, 'Getting thing data as JSON after deleting: www_viewThingDataViaAjax returns correct message.' ); ($newThingDataId,$errors) = $thingy->editThingDataSave($thingId,'new',{"field_".$fieldId => 'second test value'}); ################################################################# # # maxEntriesPerUser # ################################################################# my %otherThingProperties = %thingProperties; $otherThingProperties{maxEntriesPerUser} = 1; $otherThingProperties{editTemplateId } = $templateId; my $otherThingId = $thingy->addThing(\%otherThingProperties, 0); my %otherFieldProperties = %fieldProperties; $otherFieldProperties{thingId} = $otherThingId; my $otherFieldId = $thingy->addField(\%otherFieldProperties, 0); ok( ! $thingy->hasEnteredMaxPerUser($otherThingId), 'hasEnteredMaxPerUser: returns false with no data entered'); my @edit_thing_form_fields = qw/form_start form_end form_submit field_loop/; { WebGUI::Test->mockAssetId($templateId, $templateMock); $thingy->editThingData($otherThingId); my %miniVars; @miniVars{@edit_thing_form_fields} = @{ $templateVars }{ @edit_thing_form_fields }; cmp_deeply( \%miniVars, { form_start => ignore, form_end => ignore, form_submit => ignore, field_loop => ignore, }, 'thing edit form variables exist, because max entries not reached yet' ); } $thingy->editThingDataSave($otherThingId, 'new', {"field_".$otherFieldId => 'other test value'} ); ok( $thingy->hasEnteredMaxPerUser($otherThingId), 'hasEnteredMaxPerUser returns true with one row entered, and maxEntriesPerUser=1'); { WebGUI::Test->mockAssetId($templateId, $templateMock); $thingy->editThingData($otherThingId); my %miniVars; @miniVars{@edit_thing_form_fields} = @{ $templateVars }{ @edit_thing_form_fields }; my $existance = 0; foreach my $tmplVar (@edit_thing_form_fields) { $existance ||= exists $templateVars->{$tmplVar} } ok( ! $existance, 'thing edit form variables do not exist, because max entries was reached' ); } ################################################################# # # maxEntriesTotal # ################################################################# my %otherThingProperties = %thingProperties; $otherThingProperties{maxEntriesTotal} = 1; $otherThingProperties{editTemplateId } = $templateId; my $otherThingId = $thingy->addThing(\%otherThingProperties, 0); my %otherFieldProperties = %fieldProperties; $otherFieldProperties{thingId} = $otherThingId; my $otherFieldId = $thingy->addField(\%otherFieldProperties, 0); ok( ! $thingy->hasEnteredMaxEntries($otherThingId), 'hasEnteredMaxEntries: returns false with no data entered'); my @edit_thing_form_fields = qw/form_start form_end form_submit field_loop/; { WebGUI::Test->mockAssetId($templateId, $templateMock); $thingy->editThingData($otherThingId); my %miniVars; @miniVars{@edit_thing_form_fields} = @{ $templateVars }{ @edit_thing_form_fields }; cmp_deeply( \%miniVars, { form_start => ignore, form_end => ignore, form_submit => ignore, field_loop => ignore, }, 'thing edit form variables exist, because max entries not reached yet' ); } $thingy->editThingDataSave($otherThingId, 'new', {"field_".$otherFieldId => 'other test value'} ); ok( $thingy->hasEnteredMaxEntries($otherThingId), 'hasEnteredMaxEntries returns true with one row entered, and maxEntriesTotal=1'); { WebGUI::Test->mockAssetId($templateId, $templateMock); $thingy->editThingData($otherThingId); my %miniVars; @miniVars{@edit_thing_form_fields} = @{ $templateVars }{ @edit_thing_form_fields }; my $existance = 0; foreach my $tmplVar (@edit_thing_form_fields) { $existance ||= exists $templateVars->{$tmplVar} } ok( ! $existance, 'thing edit form variables do not exist, because max entries was reached' ); } ################################################################# # # deleteThing # ################################################################# $thingy->deleteThing($otherThingId); my $count; $count = $session->db->quickScalar('select count(*) from Thingy_things where thingId=?',[$otherThingId]); is($count, 0, 'deleteThing: clears thing from Thingy_things'); $count = $session->db->quickScalar('select count(*) from Thingy_fields where thingId=?',[$otherThingId]); is($count, 0, '... clears thing from Thingy_fields'); my $table = $session->db->dbh->table_info(undef, undef, 'Thingy_'.$otherThingId)->fetchrow_hashref(); is($table, undef, '... drops thing specific table'); ################################################################# # # thing data permissions, getFormPlugin # ################################################################# { my %newThingProperties = %thingProperties; $newThingProperties{'groupIdView'} = 3; my $newThingId = $thingy->addThing(\%newThingProperties, 0); my %newFieldProperties = %fieldProperties; $newFieldProperties{thingId} = $newThingId; my $newFieldId = $thingy->addField(\%newFieldProperties, 0); $thingy->editThingDataSave($newThingId, 'new', {"field_".$newFieldId => 'value 1'} ); $thingy->editThingDataSave($newThingId, 'new', {"field_".$newFieldId => 'value 2'} ); $thingy->editThingDataSave($newThingId, 'new', {"field_".$newFieldId => 'value 3'} ); my $andy = WebGUI::User->create($session); WebGUI::Test->addToCleanup($andy); $session->user({userId => $andy->userId}); my $form = $thingy->getFormPlugin({ name => 'fakeFormForTesting', fieldType => 'otherThing_'.$newThingId, fieldInOtherThingId => $newFieldId, }); cmp_deeply( $form->get('options'), {}, 'getFormPlugin: form has no data since the user does not have viewing privileges' ); } ################################################################# # # getFieldValue # ################################################################# { my %newThingProperties = %thingProperties; my $newThingId = $thingy->addThing(\%newThingProperties, 0); my %newFieldProperties = %fieldProperties; $newFieldProperties{thingId} = $newThingId; $newFieldProperties{fieldType} = 'Date'; my $date = $thingy->getFieldValue(WebGUI::Test->webguiBirthday, \%newFieldProperties); like($date, qr{\d+/\d+/\d+}, "getFieldValue: Date field type returns data in user's format"); $newFieldProperties{fieldType} = 'DateTime'; my $datetime = $thingy->getFieldValue(WebGUI::Test->webguiBirthday, \%newFieldProperties); like($datetime, qr{^\d+/\d+/\d+\s+\d+:\d+}, "... DateTime field also returns data in user's format"); } ################################################################# # # www_editThingDataSaveViaAjax # ################################################################# $session->request->setup_body({ thingId => $thingId, thingDataId => 'new', }); $session->user({userId => '3'}); $session->http->setStatus(200); my $json = $thingy->www_editThingDataSaveViaAjax(); is $json, '{}', 'www_editThingDataSaveViaAjax: Empty JSON hash'; is $session->http->getStatus, 200, '... http status=200'; $session->request->setup_body({ }); ################################################################# # # Unique fields # ################################################################# { my %newThingProperties = %thingProperties; $newThingProperties{'groupIdView'} = 3; my $newThingId = $thingy->addThing(\%newThingProperties, 0); my %newFieldProperties = %fieldProperties; $newFieldProperties{thingId} = $newThingId; $newFieldProperties{isUnique} = 1; my $newFieldId = $thingy->addField(\%newFieldProperties, 0); my $fieldValue = 'value 1'; my ($dataId,undef) = $thingy->editThingDataSave($newThingId, 'new', {"field_".$newFieldId => $fieldValue} ); ok( $thingy->isUniqueEntry($newThingId,"field_${newFieldId}",$fieldValue,$dataId), "unique if the same entry" ); ok( !$thingy->isUniqueEntry($newThingId,"field_${newFieldId}",$fieldValue,"new"), "new data is not unique" ); my ( undef, $errors ) = $thingy->editThingDataSave($newThingId, 'new', {"field_".$newFieldId => $fieldValue} ); ok( @$errors >= 1, "an error was returned" ); my $errorMessage = $i18n->get('needs to be unique error'); ok( grep( { $_->{error_message} =~ m/$errorMessage/ } @$errors), "error about uniqueness in right field" ); }