1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
#============================================================= -*-perl-*-
#
# t/url.t
#
# Template script testing URL plugin.
#
# Written by Andy Wardley <abw@kfs.org>
#
# Copyright (C) 2000 Andy Wardley. All Rights Reserved.
#
# This is free software; you can redistribute it and/or modify it
# under the same terms as Perl itself.
#
# $Id$
#
#========================================================================
use strict;
use lib qw( ../lib );
use Template qw( :status );
use Template::Test;
use Template::Plugin::URL;
$^W = 1;
skip_all("We can't agree on the right joint for the URL plugin");
$Template::Test::DEBUG = 0;
my $urls = {
product => {
map {
$_->{ name }, Template::Plugin::URL->new(undef, # no context
$_->{ url },
$_->{ args });
}
(
{
name => 'view',
url => '/product',
},
{
name => 'add',
url => '/product',
args => { action => 'add' },
},
{
name => 'edit',
url => '/product',
args => { action => 'edit', style => 'editor' },
},
),
},
};
my $vars = {
url => $urls,
sorted => \&sort_params,
};
test_expect(\*DATA, { INTERPOLATE => 1 }, $vars);
# url params are constructed in a non-deterministic order. we obviously
# can't test against this so we use this devious hack to reorder a
# query so that its parameters are in alphabetical order.
# ------------------------------------------------------------------------
# later note: in adding support for parameters with multiple values, the
# sort_params() hacked below got broken so as a temporary solution, I
# changed teh URL plugin to sort all params by key when generating the
# URL
sub sort_params {
my $query = shift;
my ($base, $args) = split(/\?/, $query);
my (@args, @keys, %argtab);
print STDERR "sort_parms(\"$query\")\n" if $Template::Test::DEBUG;
@args = split('&', $args);
@keys = map { (split('=', $_))[0] } @args;
@argtab{ @keys } = @args;
@keys = sort keys %argtab;
@args = map { $argtab{ $_ } } @keys;
$args = join('&', @args);
$query = join('?', length $base ? ($base, $args) : $args);
print STDERR "returning [$query]\n" if $Template::Test::DEBUG;
return $query;
}
#------------------------------------------------------------------------
# test input
#------------------------------------------------------------------------
__DATA__
-- test --
[% USE url -%]
loaded
[% url %]
[% url('foo') %]
[% url(foo='bar') %]
[% url('bar', wiz='woz') %]
-- expect --
loaded
foo
foo=bar
bar?wiz=woz
-- test --
[% USE url('here') -%]
[% url %]
[% url('there') %]
[% url(any='where') %]
[% url('every', which='way') %]
[% sorted( url('every', which='way', you='can') ) %]
-- expect --
here
there
here?any=where
every?which=way
every?which=way;you=can
-- test --
[% USE url('there', name='fred') -%]
[% url %]
[% url(name='tom') %]
[% sorted( url(age=24) ) %]
[% sorted( url(age=42, name='frank') ) %]
-- expect --
there?name=fred
there?name=tom
there?age=24;name=fred
there?age=42;name=frank
-- test --
[% USE url('/cgi-bin/woz.pl') -%]
[% url(name="Elrich von Benjy d'Weiro") %]
-- expect --
/cgi-bin/woz.pl?name=Elrich%20von%20Benjy%20d%27Weiro
-- test --
[% USE url '/script' { one => 1, two => [ 2, 4 ], three => [ 3, 6, 9] } -%]
[% url %]
-- expect --
/script?one=1;three=3;three=6;three=9;two=2;two=4
-- test --
[% url.product.view %]
[% url.product.view(style='compact') %]
-- expect --
/product
/product?style=compact
-- test --
[% url.product.add %]
[% url.product.add(style='compact') %]
-- expect --
/product?action=add
/product?action=add;style=compact
-- test --
[% url.product.edit %]
[% url.product.edit(style='compact') %]
-- expect --
/product?action=edit;style=editor
/product?action=edit;style=compact
|