The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More tests => 4;
use Test::Clustericious::Cluster;

Test::Clustericious::Cluster->extract_data_section;

my $cluster = Test::Clustericious::Cluster->new;
$cluster->create_cluster_ok(qw( Foo Foo Bar Baz ));
my $t = $cluster->t;

subtest isa => sub {
  plan tests => 6;
  isa_ok $cluster->apps->[0]->client, 'Clustericious::Client';
  isa_ok $cluster->apps->[1]->client, 'Clustericious::Client';
  isa_ok $cluster->apps->[2]->client, 'Clustericious::Client';
  isa_ok $cluster->apps->[2]->client, 'Bar::Client';
  isa_ok $cluster->apps->[3]->client, 'Clustericious::Client';
  isa_ok $cluster->apps->[3]->client, 'Baz::Client';
};

note "url[0] = @{[ $cluster->apps->[0]->client->config->url ]}";
note "url[1] = @{[ $cluster->apps->[1]->client->config->url ]}";
note "url[2] = @{[ $cluster->apps->[2]->client->config->url ]}";

subtest 'sans client class' => sub {
  plan tests => 6;

  $t->get_ok("@{[ $cluster->urls->[0] ]}/status")
    ->status_is(200)
    ->json_is('/server_version', '1.23');

  note $t->tx->res->to_string;

  my $client = $cluster->apps->[0]->client;
  is $client->status->{server_version}, '1.23';
  
  is $cluster->apps->[0]->client->config->index, 0;
  is $cluster->apps->[1]->client->config->index, 1;

};

subtest 'with client class' => sub {
  plan tests => 4;

  $t->get_ok("@{[ $cluster->urls->[2] ]}/status")
    ->status_is(200)
    ->json_is('/server_version', '4.56');

  note $t->tx->res->to_string;
 
  my $client = $cluster->apps->[2]->client;
  is $client->status->{server_version}, '4.56';
};

__DATA__

@@ etc/Foo.conf
---
url: <%= cluster->url %>
index: <%= cluster->index %>


@@ lib/Foo.pm
package Foo;

our $VERSION = '1.23';

use strict;
use warnings;
use base qw( Clustericious::App );

1;



@@ etc/Bar.conf
---
url: <%= cluster->url %>


@@ lib/Bar.pm
package Bar;

our $VERSION = '4.56';

use strict;
use warnings;
use base qw( Clustericious::App );

1;


@@ lib/Bar/Client.pm
package Bar::Client;

use strict;
use warnings;
use Clustericious::Client;

1;


@@ etc/Baz.conf
---
url: <%= cluster->url %>


@@ lib/Baz.pm
package Baz;

our $VERSION = '7.89';

use strict;
use warnings;
use base qw( Clustericious::App );

package Baz::Client;

use Clustericious::Client;

1;