App-Test-Generator

 view release on metacpan or  search on metacpan

t/params_validate.t  view on Meta::CPAN

#!/usr/bin/env perl
use strict;
use warnings;

# use Test::DescribeMe qw(extended);
use Test::Most;
use Test::Needs 'Params::Validate';
use File::Temp qw(tempdir);
use File::Spec;

# Load the module
BEGIN {
	use_ok('App::Test::Generator::SchemaExtractor');
}

# Helper to create a temporary Perl module file
sub create_test_module {
	my ($content) = @_;
	my $dir = tempdir(CLEANUP => 1);
	my $file = File::Spec->catfile($dir, 'TestModule.pm');
	open my $fh, '>', $file or die "Cannot create $file: $!";
	print $fh $content;
	close $fh;
	return $file;
}

# Helper to create an extractor for testing
sub create_extractor {
	my ($module_content) = @_;
	my $module_file = create_test_module($module_content);
	return App::Test::Generator::SchemaExtractor->new(
		input_file => $module_file,
		output_dir => tempdir(CLEANUP => 1),
		verbose	=> 0,
	);
}

# Basic default value patterns
subtest 'Extact schema from Params::Validate' => sub {
	my $module = <<'END_MODULE';
use Params::Validate qw(validate SCALAR ARRAYREF);

sub format_user {
    my %args = validate(
        @_,
        {
            username => {
                type     => SCALAR,
                optional => 0,
            },
            roles => {
                type     => ARRAYREF,
                optional => 1,
                default  => [],
            },
            uppercase => {
                type     => SCALAR,
                optional => 1,
                default  => 0,
                callbacks => {
                    'is boolean' => sub { $_[0] == 0 || $_[0] == 1 },
                },
            },
        }
    );

    my $name = $args{username};
    $name = uc($name) if $args{uppercase};

    return join(':', $name, @{ $args{roles} });
}
END_MODULE

	my $extractor = create_extractor($module);

	# Extract all schemas
	my $schemas = $extractor->extract_all();

	ok(defined($schemas));

	# use Data::Dumper;
	# diag(Dumper($schemas));

	# Verify we determined the input for format_user
	my $format_user_schema = $schemas->{format_user};
	ok($format_user_schema, 'Found format_user method schema');

	my $format_user_input = $format_user_schema->{input};
	ok($format_user_input, 'Found input method schema');

	cmp_deeply($format_user_input,  {
		'uppercase' => {
			'optional' => 1,
			'default' => 0,
			'type' => 'string'	# FIXME:  would be good to say boolean here!
		}, 'username' => {
			'type' => 'string',
			'optional' => 0
		}, 'roles' => {
			'optional' => 1,
			'type' => 'arrayref',
			'default' => []
		}
	});

	done_testing();
};

done_testing();



( run in 0.958 second using v1.01-cache-2.11-cpan-140bd7fdf52 )