#!perl

# Test form parsing.  Taken out of 83-attachments.t as a special case,
# just to make sure that the form parsing is performed correctly.

use strict;
use warnings;

use Test::More tests => 9;

use RT::Client::REST::Forms qw(form_parse);
use File::Spec::Functions   qw(catfile);

my $testfile      = 'test.png';
my $testfile_path = catfile( 't' => 'data' => $testfile );

open( my $fh, '<', $testfile_path ) or die "Couldn't open $testfile_path $!";
my $contents = do { local $/; <$fh>; };
close $fh;

sub dump_file {
    open( my $out, '>', '/tmp/test.png' );
    print $out $_[0];
    close $out;
}

sub create_http_body {
    my $binary_string = shift;
    my $length        = length($binary_string);
    my $spaces        = ' ' x length('Content: ');
    $binary_string =~ s/\n/\n$spaces/sg;
    my $body = <<"EOF";
id: 873
Subject: \nCreator: 12
Created: 2013-11-06 07:15:36
Transaction: 1457
Parent: 871
MessageId: \nFilename: prova2.png
ContentType: image/png
ContentEncoding: base64

Headers: Content-Type: image/png; name="prova2.png"
         Content-Disposition: attachment; filename="prova2.png"
         Content-Transfer-Encoding: base64
         Content-Length: $length

Content: $binary_string\n\n
EOF
    return $body;
}

{
    my $body = qq|
id: ticket/971216
Queue: whatever
Owner: Nobody
Creator: someone\@example.com
Subject: Problems
Status: new
Priority: 10
InitialPriority: 10
FinalPriority: 50
Requestors: someone\@example.com\nCc:\nAdminCc:\nCreated: Fri Nov 04 15:38:18 2022
Starts: Not set
Started: Not set
Due: Sun Nov 06 15:38:18 2022
Resolved: Not set
Told: Not set
LastUpdated: Fri Nov 04 16:19:43 2022
TimeEstimated: 0
TimeWorked: 0
TimeLeft: 0
CF.{AdminURI}: \n
|;
    my $form = form_parse($body);
    is( ref($form), 'ARRAY', 'form is an array reference' );
    my ( $c, $o, $k, $e ) = @{ $$form[0] };
    is( ref($k), 'HASH', 'third element ($k) is a hash reference' );
    is_deeply(
        $k,
        {
            'id'              => 'ticket/971216',
            'Queue'           => 'whatever',
            'Owner'           => 'Nobody',
            'Creator'         => 'someone@example.com',
            'Subject'         => 'Problems',
            'Status'          => 'new',
            'Priority'        => '10',
            'InitialPriority' => '10',
            'FinalPriority'   => '50',
            'Requestors'      => 'someone@example.com',
            'Cc'              => undef,
            'AdminCc'         => undef,
            'Created'         => 'Fri Nov 04 15:38:18 2022',
            'Starts'          => 'Not set',
            'Started'         => 'Not set',
            'Due'             => 'Sun Nov 06 15:38:18 2022',
            'Resolved'        => 'Not set',
            'Told'            => 'Not set',
            'LastUpdated'     => 'Fri Nov 04 16:19:43 2022',
            'TimeEstimated'   => '0',
            'TimeWorked'      => '0',
            'TimeLeft'        => '0',
            'CF.{AdminURI}'   => undef,
        },
        'Empty fields undertood'
    );
}

{
    my $body = create_http_body($contents);
    my $form = form_parse($body);
    is( ref($form), 'ARRAY', 'form is an array reference' );
    my ( $c, $o, $k, $e ) = @{ $$form[0] };
    is( ref($k), 'HASH', 'third element ($k) is a hash reference' );
    ok( $k->{Content} eq $contents, 'form parsed out contents correctly' );
    dump_file( $k->{Content} );
}

{
    my $body = qq|id: 17217
Subject: \nCreator: 12
Created: 2022-09-24 21:26:55
Transaction: 37112
Parent: 17215
MessageId: \nFilename: LG1kcpoxfV
ContentType: text/plain
ContentEncoding: none

Headers: Content-Transfer-Encoding: binary
         Content-Disposition: form-data; filename="LG1kcpoxfV"; name="attachment_1"
         Content-Type: text/plain; charset="utf-8"; name="LG1kcpoxfV"
         X-RT-Original-Encoding: ascii
         Content-Length: 31

Content: dude this is a text attachment



|;
    my $form = form_parse($body);
    is( ref($form), 'ARRAY', 'form is an array reference' );
    my ( $c, $o, $k, $e ) = @{ $$form[0] };
    is( ref($k), 'HASH', 'third element ($k) is a hash reference' );
    ok( $k->{Content} eq "dude this is a text attachment\n",
        'form parsed out contents correctly' );
}