The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;

package CommonTests;

use Exporter;
use Test::More;

our @ISA    = qw/Exporter/;
our @EXPORT = qw(
  test_find_package
  test_search_package
  test_find_author
  test_search_author
);

sub test_find_package {
    my $index = shift;

    my @cases = (
        {
            label  => 'query on package File::Marker',
            query  => { package => "File::Marker" },
            result => {
                package => 'File::Marker',
                version => '0.13',
                uri     => 'cpan:///distfile/DAGOLDEN/File-Marker-0.13.tar.gz',
            },
        },
        {
            label  => 'query on package dist::zilla',
            query  => { package => "dist::zilla" },
            result => undef, # should not match case insensitively
        },
        {
            label  => 'query on package without version ',
            query  => { package => "Moo::Role" },
            result => {
                package => 'Moo::Role',
                version => 'undef',
                uri     => 'cpan:///distfile/MSTROUT/Moo-1.001000.tar.gz',
            },
        },
        {
            label  => 'query on package in a perl distribution',
            query  => { package => 'attributes', },
            result => {
                package => 'attributes',
                version => '0.2',
                uri     => 'cpan:///distfile/FLORA/perl-5.17.4.tar.bz2',
            },
        },
    );

    for my $c (@cases) {
        my $got = $index->search_packages( $c->{query} );
        is_deeply( $got, $c->{result}, $c->{label} ) or diag explain $got;
    }
}

sub test_search_package {
    my $index = shift;

    my @cases = (
        {
            label  => 'query on package',
            query  => { package => qr/e::Marker$/, },
            result => [
                {
                    package => 'File::Marker',
                    version => '0.13',
                    uri     => 'cpan:///distfile/DAGOLDEN/File-Marker-0.13.tar.gz',
                }
            ],
        },
        {
            label => 'query on package and version',
            query => {
                package => qr/Marker$/,
                version => 0.13,
            },
            result => [
                {
                    package => 'File::Marker',
                    version => '0.13',
                    uri     => 'cpan:///distfile/DAGOLDEN/File-Marker-0.13.tar.gz',
                }
            ],
        },
        {
            label  => 'query on dist',
            query  => { dist => qr/1\.4404\.tar\.gz$/, },
            result => [
                {
                    'package' => 'Parse::CPAN::Meta',
                    'uri'     => 'cpan:///distfile/DAGOLDEN/Parse-CPAN-Meta-1.4404.tar.gz',
                    'version' => '1.4404'
                }
            ],
        },
    );

    for my $c (@cases) {
        my @got = $index->search_packages( $c->{query} );
        is_deeply( \@got, $c->{result}, $c->{label} ) or diag explain \@got;
    }
}

sub test_find_author {
    my $index = shift;

    my @cases = (
        {
            label  => 'query on DAGOLDEN',
            query  => { id => 'DAGOLDEN' },
            result => {
                id       => 'DAGOLDEN',
                fullname => 'David Golden',
                email    => 'dagolden@cpan.org',
            },
        },
        {
            label  => 'query on aashu (with CENSORED email)',
            query  => { id => 'aashu' },
            result => {
                id       => 'AASHU',
                fullname => 'Ashutosh Sharma',
                email    => 'CENSORED',
            },
        },
    );

    for my $c (@cases) {
        my $got = $index->search_authors( $c->{query} );
        is_deeply( $got, $c->{result}, $c->{label} ) or diag explain $got;
    }
}

sub test_search_author {
    my $index = shift;

    my @cases = (
        {
            label  => 'query id on qr/DAGOLD/',
            query  => { id => qr/DAGOLD/, },
            result => [
                {
                    id       => 'DAGOLDEN',
                    fullname => 'David Golden',
                    email    => 'dagolden@cpan.org',
                },
            ],
        },
        {
            label    => 'query email on qr/dagolden/',
            query    => { email => qr/dagolden/ },
            result => [
                {
                    id       => 'DAGOLDEN',
                    fullname => 'David Golden',
                    email    => 'dagolden@cpan.org',
                },
            ],
        },
        {
            label    => 'query fullname on qr/Golden$/',
            query    => { fullname => qr/Golden$/ },
            result => [
                {
                    id       => 'DAGOLDEN',
                    fullname => 'David Golden',
                    email    => 'dagolden@cpan.org',
                },
            ],
        },
    );

    for my $c (@cases) {
        my @got = $index->search_authors( $c->{query} );
        is_deeply( \@got, $c->{result}, $c->{label} ) or diag explain \@got;
    }
}

1;