1use strict;
2use warnings;
3use Test::More tests => 7;
4use Catalyst::Utils;
5
6{
7    package Catalyst::Controller::SomeController;
8    use Moose;
9    extends 'Catalyst::Controller';
10    with 'CatalystX::Component::Traits';
11    has '+_trait_merge' => (default => 1);
12
13    package Catalyst::TraitFor::Controller::SomeController::Foo;
14    use Moose::Role;
15    has 'foo' => (is => 'ro');
16
17    package MyApp::Controller::MyController;
18    use Moose;
19    extends 'Catalyst::Controller::SomeController';
20
21    __PACKAGE__->config(
22        traits => ['Foo', 'Bar', 'Baz'],
23        foo => 'bar'
24    );
25
26    sub find_app_class {
27        my $self = shift;
28        blessed($self->_application) || $self->_application;
29    }
30
31    package MyApp::TraitFor::Controller::SomeController::Bar;
32    use Moose::Role;
33    has 'bar' => (is => 'ro');
34
35    package MyApp::TraitFor::Controller::SomeController::Baz;
36    use Moose::Role;
37    has 'baz' => (is => 'ro');
38
39    package MyApp::TraitFor::Controller::SomeController::Quux;
40    use Moose::Role;
41    has 'quux' => (is => 'ro');
42
43    package MyApp;
44    use Moose;
45    extends 'Catalyst';
46
47    __PACKAGE__->config->{'Controller::MyController'}{traits} =
48        ['-Baz', 'Quux'];
49
50    $INC{'MyApp/Controller/MyController.pm'} = 1;
51    __PACKAGE__->setup;
52}
53
54my $app_class = 'MyApp';
55ok((my $instance = MyApp::Controller::MyController->COMPONENT(
56        $app_class,
57        { bar => 'baz' }
58    )),
59    'created a component instance');
60
61ok(($instance->does('Catalyst::TraitFor::Controller::SomeController::Foo')),
62    'instance had parent ns trait loaded from component config');
63
64ok(($instance->does('MyApp::TraitFor::Controller::SomeController::Bar')),
65    'instance had app ns trait loaded from component config');
66
67is eval { $instance->foo }, 'bar',
68    'trait initialized from component config works';
69
70is eval { $instance->bar }, 'baz',
71    'trait initialized from app config works';
72
73is $instance->find_app_class, 'MyApp', 'Can find app class passing instance';
74
75is_deeply(
76    [MyApp->controller('MyController')->meta->calculate_all_roles]->[0]->name,
77    'Catalyst::TraitFor::Controller::SomeController::Foo|MyApp::TraitFor::Controller::SomeController::Bar|MyApp::TraitFor::Controller::SomeController::Quux',
78    'traits merged correctly'
79);
80