view _test/Test/Web/ViewSelector.pm @ 372:e12c14177848

refactoring web resources model, implementing new simplified model
author cin
date Tue, 24 Dec 2013 20:01:55 +0400
parents 608e74bc309f
children
line wrap: on
line source

package Test::Web::ViewSelector;
use strict;

use Scalar::Util qw(reftype);
use IMPL::Test qw(test assert assertarray);
use IMPL::declare {
    require => {
        TTView => 'IMPL::Web::Handler::View'        
    },
    base => [
        'IMPL::Test::Unit' => '@_'
    ]
};

test TestParseRules => sub {
    my $rule = TTView->ParseRule('/category/item => item.html');
    
    assert(reftype($rule) eq 'HASH');
    assert(reftype($rule->{selector}) eq 'ARRAY');
    assertarray([map $_->{name}, @{$rule->{selector}}], [qw(category item)]);
    assert($rule->{data} eq 'item.html');
    assert($rule->{weight} == 2);
    
    $rule = TTView->ParseRule('category//item => item.html');
    
    assert(reftype($rule) eq 'HASH');
    assert(reftype($rule->{selector}) eq 'ARRAY');
    assertarray([map $_->{name}, @{$rule->{selector}}], [undef, 'category', undef ,'item']);
    assert($rule->{data} eq 'item.html');
    assert($rule->{weight} == 2);
    
    $rule = TTView->ParseRule('///category//item///// => item.html');
    # trailing slashes must be ignored
    assertarray([map $_->{name}, @{$rule->{selector}}], [undef,undef, 'category', undef ,'item']);
    
    $rule = TTView->ParseRule('{cat:\w+}@OrgClass/products/@My::PoductClass/view => view.html');
    
    assert(reftype($rule) eq 'HASH');
    assert(reftype($rule->{selector}) eq 'ARRAY');
    assert($rule->{data} eq 'view.html');
    assert($rule->{weight} == 4);
    assert($rule->{selector}[0]->{any});
    assert($rule->{selector}[1]->{rx});
    assert($rule->{selector}[1]->{var} eq 'cat');
    assert($rule->{selector}[1]->{class} eq 'OrgClass');
    assert($rule->{selector}[3]->{class} eq 'My::PoductClass');
    assertarray([map $_->{name}, @{$rule->{selector}}], [undef,undef, 'products', undef ,'view']);
    
    $rule = TTView->ParseRule('/ => index.html');
    assert($rule->{weight} == 0);
};

test TestNamesMatch => sub {
    my @rules = map TTView->ParseRule($_),
        'view => view.html', # weight 1
        'shoes/view => shoes/view.html', # weight 2
        '/root/org/items/add => add.html'; # weight 4
        
    assert(
        TTView->MatchPath(
            [ map { name => $_ }, qw(root view)],
            \@rules
        ) eq 'view.html'
    );
    
    assert(
        TTView->MatchPath(
            [ map { name => $_ }, qw(root shoes view)],
            \@rules
        ) eq 'shoes/view.html'
    );
    
    assert(
        TTView->MatchPath(
            [ map { name => $_ }, qw(root org products shoes view)],
            \@rules
        ) eq 'shoes/view.html'
    );
    
    assert(
        TTView->MatchPath(
            [ map { name => $_ }, qw(root org items add)],
            \@rules
        ) eq 'add.html'
    );
};

{
    package Test::Web::ViewSelector::Container;
    
    package Test::Web::ViewSelector::Orgs;
    use IMPL::declare {
        base => ['-Test::Web::ViewSelector::Container' => undef]
    };
}

test TestComplexMatch => sub {
    my @rules = map TTView->ParseRule($_),
        '{container:.*}@Test::Web::ViewSelector::Container/{item:.*}/{action:.*} => {container}/{item}/{action}.html', # weight 3
        '/root//orgs/{org:.*}/info => orgs/{org}.html', # weight 4
        '@Test::Web::ViewSelector::Container => container.html'; 

    my $path = [
        { name => 'root'},
        { name => 'list', class => 'Test::Web::ViewSelector::Container'},
        { name => 'hp' },
        { name => 'info'}
    ];
    
    my $result = TTView->MatchPath($path,\@rules); 
    my $expected = 'list/hp/info.html';

    assert( $result eq $expected, "Expected: $expected", "Got: $result" );
    
    $path = [
        { name => 'root'},
        { name => 'orgs', class => 'Test::Web::ViewSelector::Orgs'},
        { name => 'ms' },
        { name => 'info'}
    ];
    $result = TTView->MatchPath($path,\@rules); 
    $expected = 'orgs/ms.html';

    assert( $result eq $expected, "Expected: $expected", "Got: $result" );
    
    $path = [
        { name => 'root'},
        { name => 'service'},
        { name => 'orgs', class => 'Test::Web::ViewSelector::Container' }
    ];
    $result = TTView->MatchPath($path,\@rules); 
    $expected = 'container.html';

    assert( $result eq $expected, "Expected: $expected", "Got: $result" );
};

1;