package testcases::Web::WebFS;
use strict;
use XAO::Projects;

use base qw(XAO::testcases::Web::base);

###############################################################################

sub test_all {
    my $self=shift;

    my $odb=XAO::Objects->new(objname => 'Web::Page')->odb;
    $self->assert(ref($odb),
                  "Can't load database handler database");
    my $root=$odb->fetch('/');
    $root->put('project' => 'foo');
    $root->build_structure(
        List => {
            type        => 'list',
            class       => 'Data::Product',
            key         => 'product_id',
            structure   => {
                text => {
                    type        => 'text',
                    maxlength   => 50,
                },
                num => {
                    type        => 'integer',
                },
            },
        },
    );
    my $list=$root->get('List');
    my $l1=$list->get_new();
    $l1->put(text => 'ttt');
    $l1->put(num => 123);
    $list->put(l1 => $l1);
    $l1->put(text => 'kkk');
    $l1->put(num => 321);
    $list->put(l2 => $l1);

    my %matrix=(
        t1 => {
            template => '<%FS uri="/project"%>',
            expect   => 'foo',
        },
        t2 => {
            template => '<%FS base.database="/" uri="project"%>',
            expect  => 'foo',
        },
        t3 => {
            template => '<%FS base.database="/project"%>',
            expect  => 'foo',
        },
        t4 => {
            template => '<%FS base.database="/List/l1" uri="num"%>',
            expect  => '123',
        },
        t5 => {
            template => '<%FS mode="show-list"' .
                            ' base.database="/"' .
                            ' base.clipboard="fs_cache/test_fs"' .
                            ' uri="List"' .
                            ' fields="*"' .
                            ' header.path="/bits/WebFS/list-header"' .
                            ' path="/bits/WebFS/list-row"' .
                        '%>',
            expect => '[2]{l1-2-ttt-123}{l2-2-kkk-321}',
        },
        t6 => {
            template => '<%FS mode="show-list"' .
                            ' base.clipboard="fs_cache/test_fs"' .
                            ' uri="List"' .
                            ' fields="*"' .
                            ' path="/bits/WebFS/list-row"' .
                            ' footer.path="/bits/WebFS/list-header"' .
                        '%>',
            expect => '{l1-2-ttt-123}{l2-2-kkk-321}[2]',
        },
        t7 => {
            template => '<%FS mode="show-hash"' .
                            ' base.clipboard="fs_cache/test_fs"' .
                            ' uri="List/l2"' .
                            ' fields="*"' .
                            ' path="/bits/WebFS/hash"' .
                        '%>',
            expect => '{l2-kkk-321}',
        },
    );

    foreach my $tn (sort keys %matrix) {
        my $page=XAO::Objects->new(objname => 'Web::Page');
        my $got=$page->expand(template => $matrix{$tn}->{template});
        my $expect=$matrix{$tn}->{expect};
        $self->assert($got eq $expect,
                      "Test '$tn' failed: got '$got', expected '$expect'");
    }
}

###############################################################################

sub test_search {
    my $self=shift;

    my $odb=XAO::Objects->new(objname => 'Web::Page')->odb;
    $self->assert(ref($odb),
                  "Can't load database handler database");
    my $root=$odb->fetch('/');
    $root->put('project' => 'foo');
    $root->build_structure(
        List => {
            type        => 'list',
            class       => 'Data::Product',
            key         => 'product_id',
            structure   => {
                lcase => {
                    type        => 'text',
                    maxlength   => 50,
                },
                UCASE => {
                    type        => 'text',
                    maxlength   => 50,
                },
                mCaSe => {
                    type        => 'text',
                    maxlength   => 50,
                },
                num => {
                    type        => 'integer',
                },
            },
        },
    );
    my $list=$root->get('List');
    my $l1=$list->get_new();
    $l1->put(lcase => 'xyz1');
    $l1->put(num => '1');
    $list->put(l1 => $l1);
    my $l2=$list->get_new();
    $l2->put(UCASE => 'xyz2');
    $l2->put(num => '2');
    $list->put(l2 => $l2);
    my $l3=$list->get_new();
    $l3->put(mCaSe => 'xyz3');
    $l3->put(num => '3');
    $list->put(l3 => $l3);

    my %matrix=(
        t1 => {
            template => '<%FS mode="search"' .
                            ' base.database="/"' .
                            ' base.clipboard="fs_cache/test_fs"' .
                            ' uri="List"' .
                            ' index_1="lcase"' .
                            ' compare_1="eq"' .
                            ' value_1="xyz1"' .
                            ' fields="*"' .
                            ' template="found"' .
                            ' default.template="not found"' .
                        '%>',
            expect => 'found',
        },
        t2 => {
            template => '<%FS mode="search"' .
                            ' base.database="/"' .
                            ' base.clipboard="fs_cache/test_fs"' .
                            ' uri="List"' .
                            ' index_1="UCASE"' .
                            ' compare_1="eq"' .
                            ' value_1="xyz2"' .
                            ' fields="*"' .
                            ' template="found"' .
                            ' default.template="not found"' .
                        '%>',
            expect => 'found',
        },
        t3 => {
            template => '<%FS mode="search"' .
                            ' base.database="/"' .
                            ' base.clipboard="fs_cache/test_fs"' .
                            ' uri="List"' .
                            ' index_1="mCaSe"' .
                            ' compare_1="eq"' .
                            ' value_1="xyz3"' .
                            ' index_2="mCaSe"' .
                            ' compare_2="eq"' .
                            ' value_2="xyz3"' .
                            ' expression="1 and 2"' .
                            ' template="found"' .
                            ' default.template="not found"' .
                        '%>',
            expect => 'found',
        },
        t4 => {
            template => '<%FS mode="search"' .
                            ' base.database="/"' .
                            ' base.clipboard="fs_cache/test_fs"' .
                            ' uri="List"' .
                            ' index_1="mCaSe"' .
                            ' compare_1="eq"' .
                            ' value_1="xyz!"' .
                            ' index_2="mCaSe"' .
                            ' compare_2="eq"' .
                            ' value_2="xyz3"' .
                            ' expression="1 and 2"' .
                            ' template="found"' .
                            ' default.template="not found"' .
                        '%>',
            expect => 'not found',
        },
    );

    foreach my $tn (sort keys %matrix) {
        my $page=XAO::Objects->new(objname => 'Web::Page');
        my $got=$page->expand(template => $matrix{$tn}->{template});
        my $expect=$matrix{$tn}->{expect};
        $self->assert($got eq $expect,
                      "Test '$tn' failed: got '$got', expected '$expect'");
    }
}

###############################################################################

1;