# t/talkpost-validate-comment.t # # Test the thing that checks permissions/validity/coherency of submitted # comments (and puts them into the expected format for the functions that # enter comments into the database). # # Authors: # Nick Fagerlund # # Copyright (c) 2020 by Dreamwidth Studios, LLC. # # This program is free software; you may redistribute it and/or modify it under # the same terms as Perl itself. For a copy of the license, please reference # 'perldoc perlartistic' or 'perldoc perlgpl'. # use strict; use warnings; use Test::More; BEGIN { $LJ::_T_CONFIG = 1; require "$ENV{LJHOME}/cgi-bin/ljlib.pl"; } use LJ::Test qw( temp_user temp_comm ); use LJ::Entry; use LJ::Talk; plan tests => 6; # Refresher on form structure: # - body # - subject # - prop_something (various) # - editid and editreason, if editing # - parenttalkid: integer, comment being replied to (0 if replying to entry) # - replyto: duplicate of parenttalkid, for some reason # - subjecticon # - any captcha-related fields from the talkform (varies by captcha type) # - all other fields are ignored. MOST NOTABLY, this function stays away from # the user info fields. my $journalu = temp_user(); my $entry = $journalu->t_post_fake_entry(); note("Comment form from a logged in user:"); my $form = { body => "Comment body", subject => "Comment subject", subjecticon => "none", }; my $commenter = temp_user(); my $need_captcha = 0; my @errors = (); my $comment; # There's a nasty observer effect due to this cache: once something asks whether # two users have a particular relationship, you can never again modify that # relationship. And prepare_and_validate_comment asks about basically every # possible relationship. So SCORCH THE EARTH. my $reset = sub { foreach ( keys %LJ::REQ_CACHE_REL ) { delete $LJ::REQ_CACHE_REL{$_}; } $comment = undef; @errors = (); $need_captcha = 0; }; note("...who ain't validated:"); $comment = LJ::Talk::Post::prepare_and_validate_comment( $form, $commenter, $entry, \$need_captcha, \@errors ); ok( !defined $comment, "Returned undef, not allowed." ); note( scalar @errors . " Validation errors: " . join( "\n", @errors ) ); $reset->(); note("...who has validated their email:"); $commenter->update_self( { status => 'A' } ); $comment = LJ::Talk::Post::prepare_and_validate_comment( $form, $commenter, $entry, \$need_captcha, \@errors ); ok( ref $comment eq 'HASH', "Succeeded, returned comment" ); ok( scalar @errors == 0, "Didn't append any errors" ); note( scalar @errors . " Validation errors: " . join( "\n", @errors ) ); ok( $comment->{body} eq $form->{body}, "Comment body survived" ); ok( $comment->{subjecticon} eq '', "'none' subjecticon (w/ left beef) munged to empty string" ); $reset->(); note("...who's banned:"); $journalu->ban_user($commenter); $comment = LJ::Talk::Post::prepare_and_validate_comment( $form, $commenter, $entry, \$need_captcha, \@errors ); ok( !defined $comment, "Returned undef, not allowed." ); note( scalar @errors . " Validation errors: " . join( "\n", @errors ) ); $reset->();