# Copyright (c) 2005 bivio Software, Inc. All Rights Reserved. # $Id: dav-forum.btest,v 1.7 2010/03/03 23:43:19 nagler Exp $ # # This acceptance test includes forum and forum member test # cases, given the business logic is coupled. # test_setup('PetShop'); home_page(); my($root) = '/dav'; basic_authorization('demo'); send_request(PROPFIND => $root); my($root_forums) = "$root/Forums.csv"; verify_no_text($root_forums); test_deviance(qr{forbidden}i); send_request(GET => $root_forums); test_conformance(); basic_authorization('root'); send_request(PROPFIND => $root); verify_text($root_forums); # Create a test forum to support multiple test runs # TODO: NEED TO DELETE THE FORUM so we don't get a proliferation send_request(GET => $root_forums); my($top) = "btest_" . random_string(); my($dn) = "DAV $top BTEST"; send_request(PUT => $root_forums, undef, get_content() . <<"EOF"); $top,$dn EOF my($top_uri) = "$root/$top"; send_request(PROPFIND => "$top_uri/Files"); send_request(GET => $root_forums); my($csv) = get_content(); my($tag) = random_string(); $csv =~ s/$dn/$dn $tag/ || die; send_request(PUT => $root_forums, undef, $csv); send_request(GET => $root_forums); verify_text($tag); my($users) = [map((generate_local_email("$_-" . random_string()))[0], 0 .. 5)]; my($top_members) = "$top_uri/Members.csv"; send_request(GET => $top_members); send_request(PUT => $top_members, undef, get_content() . <<"EOF"); $users->[0],0,0,0 $users->[1],1,1,1 $users->[2],1,1,0 EOF send_request(GET => $top_members); my($found) = 0; foreach my $line (split(/\n/, get_content())) { my($u, $s, $wf, $a) = split(/,/, $line); foreach my $i (0..2) { next unless $users->[$i] eq $u; $found++; die($line) unless "$s,$wf,$a" eq ($i < 2 ? "$i,$i,$i" : '1,1,0'); } } die("only found: $found: $csv") unless $found == 3; # Add a child forum (1 level nested) my($top_forums) = "$top_uri/Forums.csv"; send_request(GET => $top_forums); send_request(PUT => $top_forums, undef, get_content() . <<"EOF"); $top-s1,s1 EOF # Rename child forum send_request(GET => $top_forums); ($csv = get_content()) =~ s/^\Q$top-s1,s1,/$top-sub1,sub forum 1,/m || die; send_request(PUT => $top_forums, undef, $csv); # Add another child forum (2 levels nested) my($sub1_forums) = "$top_uri/$top-sub1/Forums.csv"; send_request(GET => $sub1_forums); send_request(PUT => $sub1_forums, undef, get_content() . <<"EOF"); $top-sub1a,sub forum 1a EOF # Verify existing admin shows up in child forums my($sub1_members) = "$top_uri/$top-sub1/Members.csv"; send_request(GET => $sub1_members); get_content() =~ /\Q$users->[1],1,1,/ || die; my($sub1a_members) = "$top_uri/$top-sub1/$top-sub1a/Members.csv"; send_request(GET => $sub1a_members); get_content() =~ /\Q$users->[1],1,1,/ || die; # Add an admin at a child forum level send_request(GET => $sub1_members); send_request(PUT => $sub1_members, undef, get_content() . <<"EOF"); $users->[3],1,0,1 EOF # Verify add, noting that write permission auto-enabled for admins send_request(GET => $sub1_members); get_content() =~ /\Q$users->[3],1,1,1,/ || die; # Verify FILE_WRITER permission for existing admin can't be removed -- it currently can be send_request(GET => $sub1_members); ($csv = get_content()) =~ s/^(\Q$users->[3]\E),1,1,1/$1,1,0,1/m || die; send_request(PUT => $sub1_members, undef, $csv); send_request(GET => $sub1_members); get_content() =~ /\Q$users->[3],1,1,1,/ || die; #TODO: can't disable? # Verify that new admin appears in top forum as non-admin send_request(GET => $top_members); get_content() =~ /\Q$users->[3],1,0,0,/ || die; # Add an admin at top forum level and verify in child forums send_request(PUT => $top_members, undef, get_content() . <<"EOF"); $users->[4],0,0,1 EOF send_request(GET => $sub1_members); get_content() =~ /\Q$users->[4],0,1,1,/ || die; send_request(GET => $sub1a_members); get_content() =~ /\Q$users->[4],0,1,1,/ || die; # Remove new admin at child forum level send_request(GET => $sub1_members); ($csv = get_content()) =~ s/^\Q$users->[4]\E,.+\n//m || die; send_request(PUT => $sub1_members, undef, $csv); send_request(GET => $sub1_members); get_content() !~ /\Q$users->[4]/ || die; # Add a non-admin at the lowest child forum level send_request(GET => $sub1a_members); send_request(PUT => $sub1a_members, undef, get_content() . <<"EOF"); $users->[5],0,0,0 EOF # Make them an admin at the top level send_request(GET => $top_members); ($csv = get_content()) =~ s/^(\Q$users->[5]\E),1,0,0/$1,1,1,1/m || die; send_request(PUT => $top_members, undef, $csv); # Verify how that update propagates -- this currently does not # NOTE: Add above did not specify that non-admin was subscribed, # but they were subscribed when added to the higher level forums. send_request(GET => $top_members); get_content() =~ /\Q$users->[5],1,1,1,/ || die; send_request(GET => $sub1_members); get_content() =~ /\Q$users->[5],1,0,0,/ || die; send_request(GET => $sub1a_members); get_content() =~ /\Q$users->[5],0,0,0,/ || die; # Delete admin member from top level send_request(GET => $top_members); ($csv = get_content()) =~ s/^\Q$users->[5]\E,.+\n//m || die; send_request(PUT => $top_members, undef, $csv); send_request(GET => $top_members); get_content() !~ /\Q$users->[5]/ || die; send_request(GET => $sub1_members); get_content() !~ /\Q$users->[5]/ || die; send_request(GET => $sub1a_members); get_content() !~ /\Q$users->[5]/ || die; # Test ignore of empty line in CSV send_request(GET => $sub1_members); ($csv = get_content()) =~ s/^(\Q$users->[3]\E)/\n$1/m || die; send_request(PUT => $sub1_members, undef, $csv); send_request(GET => $sub1_members); my($lc) = (get_content() =~ tr/\n//); die unless $lc == 4; #3 members + header line # Test ignore of line with spaces in CSV ($csv = get_content()) =~ s/^(\Q$users->[3]\E)/ \n$1/m || die; send_request(PUT => $sub1_members, undef, $csv); send_request(GET => $sub1_members); $lc = (get_content() =~ tr/\n//); die unless $lc == 4; # Test ignore of line with commas in CSV ($csv = get_content()) =~ s/^(\Q$users->[3]\E)/,,,\n$1/m || die; send_request(PUT => $sub1_members, undef, $csv); send_request(GET => $sub1_members); $lc = (get_content() =~ tr/\n//); die unless $lc == 4;