Update admin_users to be able to remove traditions from users
[scpubgit/stemmatology.git] / t / text_tradition_user.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More 'no_plan';
7 use File::Temp;
8
9 use_ok('Text::Tradition::Directory');
10
11 my $fh = File::Temp->new();
12 my $file = $fh->filename;
13 $fh->close;
14 my $dsn = "dbi:SQLite:dbname=$file";
15
16 my $user_store = Text::Tradition::Directory->new('dsn' => $dsn,
17                                                  'extra_args' => { 'create' => 1 } );
18
19 my $scope = $user_store->new_scope;
20
21 ## passwords
22 my $shortpass = 'bloggs';
23 ok(!$user_store->validate_password($shortpass), '"bloggs" is too short for a password');
24
25 ## create user
26 my $new_user = $user_store->add_user({ username => 'fred',
27                                        password => 'bloggspass'});
28 isa_ok($new_user, 'Text::Tradition::User');
29 is($new_user->active, 1, 'New user created and active');
30
31 ## find user
32 my $find_user = $user_store->find_user({ username => 'fred'});
33 isa_ok($find_user, 'Text::Tradition::User');
34 ok($find_user->check_password('bloggspass'), 'Stored & retrieved with correct password');
35
36 ## modify user
37 my $changed_user = $user_store->modify_user({ username => 'fred',
38                                               password => 'passbloggs' });
39 isa_ok($changed_user, 'Text::Tradition::User');
40 my $changed = $user_store->find_user({ username => 'fred'});
41 ok($changed->check_password('passbloggs'), 'Modified & retrieved with correct new password');
42
43 {
44 ## deactivate user
45 ## Sets all traditions to non-public, deactivates
46     my $user = $user_store->add_user({ username => 'testactive',
47                                        password => 'imanactiveuser' });
48     ok($user->active, 'Deactivate test user starts active');
49
50     my $d_user = $user_store->deactivate_user({ username => 'testactive' });
51     is($d_user->active, 0, 'Deactivated user');
52     is($user_store->find_user({ username => 'testactive' }), undef, 'Deactivated user not returned by find_user');
53
54 ## TODO - add test where user has traditions to start with
55 }
56
57 {
58 ## reactivate user
59 ## reactivates user, does not mess with their traditions (as we don't know which were public to start with)
60
61     my $user = $user_store->add_user({ username => 'testinactive',
62                                        password => 'imaninactiveuser' });
63     my $d_user = $user_store->deactivate_user({ username => 'testinactive' });
64     ok(!$d_user->active, 'Deactivate test user starts active');   
65     
66     my $a_user = $user_store->reactivate_user({ username => 'testinactive' });
67     is($a_user->active, 1, 'Re-activated user');
68     ok($user_store->find_user({ username => 'testinactive' }), 'Re-activated user returned by find_user again');
69 }
70
71 {
72 ## delete user (admin only?)
73     my $user = $user_store->add_user({ username => 'testdelete',
74                                        password => 'imgoingtobedeleted' });
75
76     my $gone = $user_store->delete_user({ username => 'testdelete' });
77
78     my $d_user = $user_store->find_user({ username => 'testdelete' });
79
80     ok($gone && !$d_user, 'Deleted user completely from store');
81 }
82
83 {
84 ## add_tradition
85     use Text::Tradition;
86     my $t = Text::Tradition->new( 
87         'name'  => 'inline', 
88         'input' => 'Tabular',
89         'file'  => 't/data/simple.txt',
90         );
91
92     my $uuid = $user_store->save($t);
93     my $user = $user_store->add_user({ username => 'testadd',
94                                        password => 'testingtraditions' });
95     $user->add_tradition($t);
96     $user_store->update($user);
97
98     is( scalar @{$user->traditions}, 1, 'Added one tradition');
99
100     my @tlist = $user_store->traditionlist($user);
101     is($tlist[0]->{name}, $t->name, 'Traditionlist returns same named user->tradition');
102     is($tlist[0]->{id}, $uuid, 'Traditionlist returns actual tradition with same uuid we put in earlier');
103 }
104
105 {
106 ## remove_tradition
107     use Text::Tradition;
108     my $t = Text::Tradition->new( 
109         'name'  => 'inline', 
110         'input' => 'Tabular',
111         'file'  => 't/data/simple.txt',
112         );
113
114     my $uuid = $user_store->save($t);
115     my $user = $user_store->add_user({ username => 'testremove',
116                                        password => 'testingtraditions' });
117     $user->add_tradition($t);
118     $user_store->update($user);
119
120     $user->remove_tradition($t);
121     $user_store->update($user);
122     my $changed_t = $user_store->tradition($uuid);
123
124     is( scalar @{$user->traditions}, 0, 'Added and removed one tradition');
125     ok(!$changed_t->has_user, 'Removed user from tradition');
126
127     my @tlist = $user_store->traditionlist($user);
128     is(scalar @tlist, 0, 'Traditionlist now empty');
129 }
130