The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;
use Test::More 0.96;
use Test::Deep;
use Test::Exception;

use lib 't/lib';

our $es;
do 'es.pl';

use_ok 'MyApp' || print 'Bail out';

my $model = new_ok( 'MyApp', [ es => $es ], 'Model' );
ok my $ns = $model->namespace('myapp'), 'Got ns';

ok $ns->index('myapp2')->create, 'Create index myapp2';
ok $ns->index('myapp3')->create, 'Create index myapp3';

wait_for_es();

isa_ok
    my $alias = $ns->alias(),
    'Elastic::Model::Alias',
    'alias myapp';

is $alias->name, 'myapp', 'Alias name is myapp';

## Alias to, add, remove ##

ok $alias->to( 'myapp2', 'myapp3' ), 'Alias to myapp2/3';
cmp_deeply $alias->aliased_to, { myapp2 => {}, myapp3 => {} },
    'Aliased to myapp2/3';

ok $alias->to(
    myapp2 => { routing => 'foo' },
    myapp3 => { filterb => { foo => 'bar' } }
    ),
    'Alias with settings';
cmp_deeply $alias->aliased_to,
    {
    myapp2 => { index_routing => 'foo', search_routing => 'foo' },
    myapp3 => { filter => { term => { foo => 'bar' } } }
    },
    'Aliased to myapp2/3';

ok $alias->to('myapp3'), 'Re-alias to only myapp3';
cmp_deeply $alias->aliased_to, { myapp3 => {} }, 'Is re-aliased';

ok $alias->add(
    myapp2 => { index_routing => 'foo', search_routing => 'bar' } ),
    'Add alias';
cmp_deeply $alias->aliased_to,
    {
    myapp2 => { index_routing => 'foo', search_routing => 'bar' },
    myapp3 => {}
    },
    'Alias added';

ok $alias->remove('myapp3'), 'Remove alias';
cmp_deeply $alias->aliased_to,
    { myapp2 => { index_routing => 'foo', search_routing => 'bar' } },
    'Alias removed';

throws_ok sub { $ns->alias('myapp3')->aliased_to }, qr/not an alias/,
    'index->aliased_to';

ok $alias->to(), 'Delete alias';
ok !$alias->is_alias, 'Alias deleted';

## Namespace->all_domains ##
cmp_bag [ $ns->all_domains ], ['myapp'], 'Domains - only ns name';
ok $alias->to( 'myapp2', 'myapp3' ), 'Alias to myapp2/3';
cmp_bag [ $ns->all_domains ], [ 'myapp', 'myapp2', 'myapp3' ],
    'Domains - all 3';

ok $ns->index('myapp4')->create, 'Create index myapp4';
ok $ns->alias('myapp5')->to( 'myapp3', 'myapp4' ), 'Add alias myapp5';
cmp_bag [ $ns->all_domains ], [ 'myapp', 'myapp2', 'myapp3', 'myapp5' ],
    'Domains - all 4 indices';

ok $alias->to(), 'Remove main alias';

## Fixed domains ##
isa_ok $ns = $model->namespace('myapp1'), 'Elastic::Model::Namespace',
    'Namespace2';
cmp_bag
    [ $ns->all_domains ],
    [ 'myapp1', 'myapp1_fixed' ],
    'Domains - ns name plus fixed';

ok $ns->alias->to( 'myapp2', 'myapp3', 'myapp4' ), 'Alias to myapp2/3/4';
cmp_bag
    [ $ns->all_domains ],
    [ 'myapp1', 'myapp1_fixed', 'myapp2', 'myapp3', 'myapp4', 'myapp5' ],
    'Domains - all plus myapp5';

done_testing;

__END__