1use Test::More tests => 36; 2 3use lib '../lib'; 4use Test::Deep; 5use Config::JSON; 6use File::Temp qw/ tempfile /; 7 8my ($fh, $filename) = tempfile(); 9close($fh); 10my $config = Config::JSON->create($filename); 11ok (defined $config, "create new config"); 12 13# set up test data 14if (open(my $file, ">", $filename)) { 15my $testData = <<END; 16# config-file-type: JSON 1 17 18 { 19 "dsn" : "DBI:mysql:test", 20 "user" : "tester", 21 "password" : "xxxxxx", 22 23 # some colors to choose from 24 "colors" : [ "red", "green", "blue" ], 25 26 # some statistics 27 "stats" : { 28 "health" : 32, 29 "vitality" : 11 30 }, 31 32 # multilevel 33 "this" : { 34 "that" : { 35 "scalar" : "foo", 36 "array" : ["foo", "bar"], 37 "hash" : { 38 "foo" : 1, 39 "bar" : 2 40 } 41 } 42 } 43 } 44 45END 46 print {$file} $testData; 47 close($file); 48 ok(1, "set up test data"); 49} 50else { 51 ok(0, "set up test data"); 52} 53 54$config = Config::JSON->new($filename); 55isa_ok($config, "Config::JSON" ); 56 57# getFilePath and getFilename 58is( $config->getFilePath, $filename, "getFilePath()" ); 59my $justTheName = $filename; 60$justTheName =~ s{.*/(\w+)$}{$1}xmsg; 61is( $config->getFilename, $justTheName, "getFilename()" ); 62 63# get 64ok( $config->get("dsn") ne "", "get()" ); 65is( ref $config->get("stats"), "HASH", "get() hash" ); 66is( ref $config->get("colors"), "ARRAY", "get() array" ); 67is( $config->get("this/that/scalar"), "foo", "get() multilevel"); 68is( ref $config->get("this/that/hash"), "HASH", "get() hash multilevel" ); 69is( ref $config->get("this/that/array"), "ARRAY", "get() array multilevel" ); 70eval{$config->get("this/that/array/non-existant-element")}; 71ok($@, "Throw an error when trying to access an element of an array."); 72 73# set 74$config->set('privateArray', ['a', 'b', 'c']); 75cmp_bag($config->get('privateArray'), ['a', 'b', 'c'], 'set()'); 76$config->set('cars/ford', "mustang"); 77is($config->get('cars/ford'), "mustang", 'set() multilevel non-exisistant'); 78$config->set('cars/ford', [qw( mustang pinto maverick )]); 79cmp_bag($config->get('cars/ford'),[qw( mustang pinto maverick )], 'set() multilevel'); 80$config->addToHash('hash','cdn\\/','CDNRoot'); 81my $hash = $config->get('hash'); 82is $hash->{'cdn/'}, 'CDNRoot', 'allow for escaped slashes in keys'; 83my $reconfig = Config::JSON->new($filename); 84cmp_bag($config->get('cars/ford'),$reconfig->get('cars/ford'), 'set() multilevel after re-reading config file'); 85$config->set('Data::GUID', '9EDE9D96-D416-11DF-A7FC-B391564030AF'); 86is($config->get('Data::GUID'), '9EDE9D96-D416-11DF-A7FC-B391564030AF', 'report that Data::GUID does not work with CJ'); 87 88# delete 89$config->delete("dsn"); 90ok(!(defined $config->get("dsn")), "delete()"); 91$config->delete("stats/vitality"); 92ok(!(defined $config->get("stats/vitality")), "delete() multilevel"); 93ok(defined $config->get("stats"), "delete() multilevel - doesn't delete parent"); 94$config->delete('this/that/hash'); 95ok(defined $config->get('this/that/scalar'), "delete() multilevel - doesn't delete siblings"); 96 97# addToArray 98$config->addToArray("colors","TEST"); 99ok((grep /TEST/, @{$config->get("colors")}), "addToArray()"); 100$config->addToArray("cars/ford", "fairlane"); 101ok((grep /fairlane/, @{$config->get("cars/ford")}), "addToArray() multilevel"); 102 103# deleteFromArray 104$config->deleteFromArray("colors","TEST"); 105ok(!(grep /TEST/, @{$config->get("colors")}), "deleteFromArray()"); 106$config->deleteFromArray("cars/ford", "fairlane"); 107ok(!(grep /fairlane/, @{$config->get("cars/ford")}), "deleteFromArray() multilevel"); 108 109# addToArrayBefore 110$config->addToArrayBefore("colors","green",'orange'); 111is_deeply($config->get('colors'), [qw(red orange green blue)], "addToArrayBefore works"); 112$config->addToArrayBefore("colors","green",'orange'); 113is_deeply($config->get('colors'), [qw(red orange green blue)], "addToArrayBefore doesn't insert duplicate entries"); 114$config->addToArrayBefore('colors', 'purple', 'black'); 115is_deeply($config->get('colors'), [qw(black red orange green blue)], "addToArrayBefore with item that doesn't exist adds to beginning of array"); 116$config->set('colors', [qw(red green blue)]); 117 118# addToArrayAfter 119$config->addToArrayAfter('colors', 'green', 'orange'); 120is_deeply($config->get('colors'), [qw(red green orange blue)], "addToArrayAfter works"); 121$config->addToArrayAfter('colors', 'green', 'orange'); 122is_deeply($config->get('colors'), [qw(red green orange blue)], "addToArrayAfter doesn't insert duplicate entries"); 123$config->addToArrayAfter('colors', 'purple', 'black'); 124is_deeply($config->get('colors'), [qw(red green orange blue black)], "addToArrayAfter with item that doesn't exist adds to end of array"); 125$config->set('colors', [qw(red green blue)]); 126 127# addToHash 128$config->addToHash("stats","TEST","VALUE"); 129is($config->get("stats/TEST"), "VALUE", "addToHash()"); 130$config->addToHash("this/that/hash", "three", 3); 131is($config->get("this/that/hash/three"), 3, "addToHash() multilevel"); 132 133# deleteFromHash 134$config->deleteFromHash("stats","TEST"); 135$hash = $config->get("stats"); 136ok(!(exists $hash->{TEST}), "deleteFromHash()"); 137$config->deleteFromHash("this/that/hash", "three"); 138$hash = $config->get("this/that/hash"); 139ok(!(exists $hash->{three}), "deleteFromHash() multilevel"); 140 141 142