#!/usr/bin/env perl
use strict;
use warnings;
use Carp;
use Data::Dump qw( dump );
use JSON;

use constant HAS_LEAKTRACE => eval { require Test::LeakTrace };
use Test::More HAS_LEAKTRACE
    ? ( tests => 21 )
    : ( skip_all => 'require Test::LeakTrace' );
use Test::LeakTrace;

SKIP: {

    my $index_path = $ENV{OPENSEARCH_INDEX};
    if ( !defined $index_path or !-d $index_path ) {
        diag("set OPENSEARCH_INDEX to valid path to test Plack with Lucy");
        skip "set OPENSEARCH_INDEX to valid path to test Plack with Lucy", 21;
    }
    eval "use Plack::Test";
    if ($@) {
        skip "Plack::Test not available", 21;
    }
    eval "use Search::OpenSearch::Engine::Lucy";
    if ($@) {
        skip "Search::OpenSearch::Engine::Lucy not available", 21;
    }

    require Search::OpenSearch::Server::Plack;
    require HTTP::Request;

    leaks_cmp_ok {
        my $app = Search::OpenSearch::Server::Plack->new(
            engine_config => {
                type  => 'Lucy',
                index => [$index_path],
                facets =>
                    { names => [qw( topics people places orgs author )], },
                fields => [qw( topics people places orgs author )],
            }
        );
        test_psgi(
            app    => $app,
            client => sub {
                my $cb = shift;
                my $req
                    = HTTP::Request->new( GET => 'http://localhost/?q=test' );
                my $res = $cb->($req);
                ok( my $results = decode_json( $res->content ),
                    "decode_json response" );
                is( $results->{query}, "test", "query param returned" );
                cmp_ok( $results->{total}, '>', 1, "more than one hit" );
                ok( exists $results->{search_time},
                    "search_time key exists" );
                is( $results->{title}, qq/OpenSearch Results/, "got title" );
            }
        );
    }
    '<', 1, "no mem leaks";

}