#!perl use strict; use warnings; use Test::More; use Test::Deep qw(cmp_details deep_diag bag); use Data::Dump qw(pp); use Test::Exception; use Elastic::Model::SearchBuilder; use lib 't/lib'; our $es; do 'es.pl'; use_ok 'MyApp' || print 'Bail out'; my $model = new_ok( 'MyApp', [ es => $es ], 'Model' ); ok $model->namespace('myapp')->index->create, 'Created index'; isa_ok my $domain = $model->domain('myapp'), 'Elastic::Model::Domain'; isa_ok my $user = $domain->new_doc( user => { id => 1, name => 'X' } ), 'MyApp::User', 'User'; isa_ok my $uid = $user->uid, 'Elastic::Model::UID', 'UID'; my @objs = ( $user, $uid ); my $a = Elastic::Model::SearchBuilder->new; test_filters( 'HASHREF - key', 'Object', { 'user' => $user }, { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] }, 'UID', { 'user' => $uid }, { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] }, ); test_filters( '= op', 'Object', { 'user' => { '=' => $user } }, { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] }, 'UID', { 'user' => { '=' => $uid } }, { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] }, ); test_filters( '!= op', 'Object', { 'user' => { '!=' => $user } }, { not => { filter => { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] } } }, 'UID', { 'user' => { '!=' => $uid } }, { not => { filter => { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] } } }, ); test_filters( 'ARRAYREF', 'Objects', { 'user' => \@objs }, { or => [ { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] }, { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] }, ] }, '= Objects', { 'user' => { '=' => \@objs } }, { or => [ { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] }, { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] }, ] }, '!= Objects', { 'user' => { '!=' => \@objs } }, { not => { filter => { or => [ { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] }, { and => [ { term => { 'user.uid.index' => 'myapp' } }, { term => { 'user.uid.type' => 'user' } }, { term => { 'user.uid.id' => 1 } }, ] }, ] } } } ); done_testing(); #=================================== sub test_filters { #=================================== note "\n" . shift(); while (@_) { my $name = shift; my $in = shift; my $out = shift; if ( ref $out eq 'Regexp' ) { throws_ok { $a->filter($in) } $out, $name; next; } my $got = $a->filter($in); my $expect = { filter => $out }; my ( $ok, $stack ) = cmp_details( $got, $expect ); if ($ok) { pass $name; next; } fail($name); note("Got:"); note( pp($got) ); note("Expected:"); note( pp($expect) ); diag( deep_diag($stack) ); } }