4 use Test::More tests => 101;
7 my $cgidir = File::Spec->catdir(BSE::Test::base_dir, 'cgi-bin');
8 ok(chdir $cgidir, "switch to CGI directory");
11 my $cfg = BSE::Cfg->new;
12 # create some articles to test with
13 require BSE::TB::Articles;
14 require BSE::TB::Products;
15 require BSE::TB::ProductOptions;
16 require BSE::TB::ProductOptionValues;
18 require BSE::Dynamic::Catalog;
19 require BSE::Request::Test;
22 $SIG{__DIE__} = sub { confess @_ };
29 test2 => [ qw/two three/ ],
30 test3 => "Size: Medium",
31 test4 => [ "Size: Medium", "Colour: Red" ],
32 test5 => "Size:Medium/Colour:Red/Style:Pretty",
33 test6 => "/Size:Medium//Colour:Red/",
37 my $req = BSE::Request::Test->new(cfg => $cfg, params => \%cgi);
38 my $gen = BSE::Dynamic::Catalog->new($req);
39 BSE::API->import(qw/bse_make_catalog bse_make_product bse_add_step_child/);
41 sub dyn_template_test($$$$);
43 my $parent = bse_make_catalog
46 title => "test & catalog",
47 body => "Test catalog for catalog tests",
51 ok($parent, "made a catalog");
52 is($parent->{generator}, "BSE::Generate::Catalog", "check generator");
55 my $parent2 = bse_make_catalog
58 title => "second test catalog",
59 body => "second test catalog"
62 ok($parent2, "got second catalog");
63 isnt($parent->{displayOrder}, $parent2->{displayOrder},
64 "make sure we get unique display orders");
66 my $parent3 = bse_make_catalog
69 parentid => $parent->{id},
70 title => "third test catalog",
71 body => "third test catalog"
79 for my $title (qw/prod1 prod2 prod3 prod4 prod5 prod6 prod7 prod8 prod9 prod10/) {
80 my $prod = bse_make_product
83 parentid => $parent->{id},
85 retailPrice => $price,
87 product_code => $title
89 ok($prod, "make product $title/$prod->{id}");
90 unshift @prods, $prod;
91 $prods{$prod->title} = $prod;
92 $prod_order{$prod->{displayOrder}} = 1;
96 # give the last an option
98 my $opt = BSE::TB::ProductOptions->make
100 product_id => $prods[2]->id,
101 name => "Test Option",
102 display_order => $order++,
104 BSE::TB::ProductOptionValues->make
106 product_option_id => $opt->id,
108 display_order => $order++,
110 BSE::TB::ProductOptionValues->make
112 product_option_id => $opt->id,
114 display_order => $order++,
117 is(scalar keys %prod_order, 10, "make sure display orders unique");
119 my $prod4 = bse_make_product
122 parentid => $parent2->{id},
123 title => "other catalog prod",
124 retailPrice => $price,
125 body => "other catalog prod",
126 product_code => "other catalog prod"
128 ok($prod4, "made prod in other catalog");
130 my $prod_step_link = bse_add_step_child
136 ok($prod_step_link, "made the product step link");
148 prod1 => [ "Size: Small", "Colour: Red", "ABC" ],
149 prod2 => [ "Size: Small", "Colour: Blue" ],
150 prod3 => [ "Size: Small", "Colour: Green", "ABC" ],
151 prod4 => [ "Size: Medium", "Colour: Red" ],
152 prod5 => [ "Size: Medium", "Colour: Blue", "Colour: Purple" ],
153 prod6 => [ "Size: Medium", "Colour: Green" ],
154 prod7 => [ "Size: Medium", "Colour: Black" ],
155 prod8 => [ "Size: Large", "Colour: Red" ],
156 prod9 => [ "Size: Large", "Colour: Blue" ],
157 prod10 => [ "Size: Large", "Colour: Green", "XYZ" ],
160 for my $key (sort keys %tags) {
162 ok($prods{$key}->set_tags($tags{$key}, \$error),
164 or print("# error: $error");
166 my @set = sort @{$tags{$key}};
167 my @tags = sort $prods{$key}->tags;
168 is_deeply(\@set, \@tags, "check tags set for $key");
172 $parent->set_tags([ "Brand: Foo", "Class: Network" ], \$error);
175 dyn_template_test "dynallprods", $parent, <<TEMPLATE, <<EXPECTED;
176 <:iterator begin dynallprods:><:
177 dynallprod id:><:ifDynAnyProductOptions:> options<:or:><:eif:>
178 <:iterator end dynallprods:>
183 $prods[2]{id} options
194 dyn_template_test "article tags", $parent, <<TEMPLATE, <<EXPECTED;
197 Brand: Foo/Class: Network
200 dyn_template_test "dynallprods tag filter", $parent, <<TEMPLATE, <<EXPECTED;
201 <:iterator begin dynallprods tags: "Size: Small" :><:
203 <:iterator end dynallprods:>
211 dyn_template_test "dynallprods tag filter cgi", $parent, <<TEMPLATE, <<EXPECTED;
212 <:iterator begin dynallprods tags: [lcgi test3] :><:
214 <:iterator end dynallprods:>
223 dyn_template_test "dynallprods tag filter", $parent, <<TEMPLATE, <<EXPECTED;
224 <:iterator begin dynunused_tagcats dynallprods tags: "Size: Small" :><:
225 ifDynunused_tagcat nocat:><:or:><:
226 dynunused_tagcat name:>:
228 :><:iterator begin dynunused_tags:> <:dynunused_tag val:> (<:dynunused_tag count:>)
229 <:iterator end dynunused_tags:><:iterator end dynunused_tagcats :>
239 dyn_template_test "unused tags no highlander", $parent, <<TEMPLATE, <<EXPECTED;
240 <:iterator begin dynunused_tagcats dynallprods tags: "Colour: Blue" :><:
241 ifDynunused_tagcat nocat:><:or:><:
242 dynunused_tagcat name:>:
244 :><:iterator begin dynunused_tags:> <:dynunused_tag val:> (<:dynunused_tag count:>)
245 <:iterator end dynunused_tags:><:iterator end dynunused_tagcats :>
256 dyn_template_test "unused tags highlander", $parent, <<TEMPLATE, <<EXPECTED;
257 <:iterator begin dynunused_tagcats dynallprods onlyone tags: "Colour: Blue" :><:
258 ifDynunused_tagcat nocat:><:or:><:
259 dynunused_tagcat name:>:
261 :><:iterator begin dynunused_tags:> <:dynunused_tag val:> (<:dynunused_tag count:>)
262 <:iterator end dynunused_tags:><:iterator end dynunused_tagcats :>
271 dyn_template_test "unused tags unfiltered", $parent, <<TEMPLATE, <<EXPECTED;
272 <:iterator begin dynunused_tagcats dynallprods tags: "" :><:
273 ifDynunused_tagcat nocat:><:or:><:
274 dynunused_tagcat name:>:
276 :><:iterator begin dynunused_tags:> <:dynunused_tag val:> (<:dynunused_tag count:>)
277 <:iterator end dynunused_tags:><:iterator end dynunused_tagcats :>
294 dyn_template_test "unused tags cat filtered", $parent, <<TEMPLATE, <<EXPECTED;
295 <:iterator begin dynunused_tagcats dynallprods category:"Colour" tags: "" :><:
296 ifDynunused_tagcat nocat:><:or:><:
297 dynunused_tagcat name:>:
299 :><:iterator begin dynunused_tags:> <:dynunused_tag val:> (<:dynunused_tag count:>)
300 <:iterator end dynunused_tags:><:iterator end dynunused_tagcats :>
311 dyn_template_test "unused tags new style", $parent, <<TEMPLATE, <<EXPECTED;
312 <:.set ptags = dynarticle.collection_with_tags(
313 "all_visible_products",
319 <:# = bse.dumper(ptags) -:>
320 <:.set ptagcats = bse.categorize_tags(ptags.extratags, [],
323 "counts":ptags.counts
325 <:.for cat in ptagcats -:>
327 <:.for val in cat.vals -:>
328 <:= " " _ val.val :> (<:= val.count :>)
341 dyn_template_test "dyntags", $parent, <<TEMPLATE, <<EXPECTED;
342 <:iterator begin dyntags "Size: Small/Colour: Red/XYZ" :><:
343 dyntag name:>|<:dyntag cat:>|<:dyntag val:>|
344 <:iterator end dyntags :>
345 <:iterator begin dyntags [lcgi test5] :><:
346 dyntag name:>|<:dyntag cat:>|<:dyntag val:>|
347 <:iterator end dyntags :>
348 <:iterator begin dyntags [lcgi test6] :><:
349 dyntag name:>|<:dyntag cat:>|<:dyntag val:>|
350 <:iterator end dyntags :>
352 Size: Small|Size|Small|
353 Colour: Red|Colour|Red|
356 Size: Medium|Size|Medium|
357 Colour: Red|Colour|Red|
358 Style: Pretty|Style|Pretty|
360 Size: Medium|Size|Medium|
361 Colour: Red|Colour|Red|
365 dyn_template_test "dynallcats", $parent, <<TEMPLATE, <<EXPECTED;
366 <:iterator begin dynallcats:><:
368 <:iterator end dynallcats:>
375 dyn_template_test "empty dyncart", $parent, <<TEMPLATE, <<EXPECTED;
376 <:iterator begin dyncart:><:
377 dyncartitem title:> <:money dyncartitem price:>
378 <:iterator end dyncart:>
379 Total: <:money dyncarttotalcost:>
385 # fake an item in the cart
386 $req->session->{cart} =
389 productId => $prods{prod3}{id},
391 price => scalar $prods{prod3}->price(),
392 title => scalar $prods{prod3}->title,
396 dyn_template_test "nonempty dyncart", $parent, <<TEMPLATE, <<EXPECTED;
397 <:iterator begin dyncart:><:
398 dyncartitem title:> <:money dyncartitem price:>
399 <:iterator end dyncart:>
400 Total: <:money dyncarttotalcost:>
407 dyn_template_test "cgi", $parent, <<TEMPLATE, <<EXPECTED;
417 dyn_template_test "lcgi", $parent, <<TEMPLATE, <<EXPECTED;
423 ><:lcgi ")(" test2:><
433 dyn_template_test "deltag", $parent, <<TEMPLATE, <<EXPECTED;
434 ><:deltag "Size: Medium" [lcgi test4]:><
435 ><:deltag "Size:Medium" [lcgi test4]:><
436 ><:deltag "Size:Medium/Colour:Red" [lcgi test5]:><
437 ><:deltag "Size:Medium" [lcgi test5]:><
438 <:iterator begin dyntags [lcgi test5]
439 :><:dyntag name:> - <:deltag [dyntag name] [lcgi test5]:>
440 <:iterator end dyntags:>
445 >Colour: Red/Style: Pretty<
446 Size: Medium - Colour: Red/Style: Pretty
447 Colour: Red - Size: Medium/Style: Pretty
448 Style: Pretty - Size: Medium/Colour: Red
452 dyn_template_test "ifTagIn", $parent, <<TEMPLATE, <<EXPECTED;
453 <:ifTagIn "Size:medium" [lcgi test5]:>1<:or:>0<:eif:>
454 <:ifTagIn "Size: Huge" [lcgi test5]:>1<:or:>0<:eif:>
455 <:ifTagIn "Size: Medium" [lcgi test5]:>1<:or:>0<:eif:>
456 <:ifTagIn "DEF" [lcgi test5]:>1<:or:>0<:eif:>
464 dyn_template_test "paged default", $parent, <<TEMPLATE, <<EXPECTED;
465 <:iterator begin dynallprods paged: :><:iterator end dynallprods:>
466 Current page: <:dynallprods_page:>
467 Page count: <:dynallprods_pagecount:>
468 Next page: <:dynallprods_nextpage:>
469 Previous page: <:dynallprods_prevpage:>
470 Total count: <:dynallprod_totalcount:>
471 Count: <:dynallprod_count paged: :>
472 First number this page: <:dynallprods_firstnumber:>
473 Last number this page: <:dynallprods_lastnumber:>
474 Perpage: <:dynallprods_perpage:>
475 Pages: <:iterator begin dynallprods_pagec
476 :><:dynallprod_pagec page
477 :><:ifDynallprod_pagec current:>c<:or:><:eif
478 :><:ifDynallprod_pagec first:>f<:or:><:eif
479 :><:ifDynallprod_pagec last:>l<:or:><:eif
480 :><:ifDynallprod_pagec next:>n<:dynallprod_pagec next:><:or:><:eif
481 :><:ifDynallprod_pagec prev:>p<:dynallprod_pagec prev:><:or:><:eif:> <:iterator end dynallprods_pagec
483 <:iterator begin dynallprods paged:
484 :><:dynallprod_number:> <:dynallprod title:>
485 <:iterator end dynallprods:>
494 First number this page: 6
495 Last number this page: 10
497 Pages: 1fn2 2cn3p1 3lp2
506 dyn_template_test "template vars", $parent, <<TEMPLATE, <<EXPECTED;
507 Article Title: [<:= article.title |html :>]
508 Top Title: [<:= top.title |html :>]
509 Embedded: [<:= embedded | html :>]
510 Dynamic: [<:= dynamic | html :>]
512 Article Title: [test & catalog]
513 Top Title: [test & catalog]
518 dyn_template_test "unknown vars", $parent, <<TEMPLATE, <<EXPECTED;
521 * Variable 'unknown_var' not set
525 $prod4->remove($cfg);
526 for my $prod (@prods) {
529 $parent3->remove($cfg);
530 $parent2->remove($cfg);
531 $parent->remove($cfg);
533 # produces three test results
534 sub dyn_template_test($$$$) {
535 my ($tag, $article, $template, $expected) = @_;
537 #diag "Template >$template<";
540 my $gen_class = $article->{generator};
541 $gen_class =~ s/.*\W//;
542 $gen_class = "BSE::Dynamic::".$gen_class;
543 (my $filename = $gen_class) =~ s!::!/!g;
546 $gen_class->new($req);
548 ok($gen, "$tag: created generator $article->{generator}");
551 # get the template - always regen it
552 my $work_template = _generate_dyn_template($article, $template);
556 skip "$tag: couldn't make generator", 1 unless $gen;
559 $gen->generate($article, $work_template);
561 ok($result, "$tag: generate content");
562 diag $@ unless $result;
565 skip "$tag: couldn't gen content", 1 unless $result;
566 is($result->{content}, $expected, "$tag: comparing");
570 sub _generate_dyn_template {
571 my ($article, $template) = @_;
573 my $articles = 'BSE::TB::Articles';
574 my $genname = $article->{generator};
577 my $gen = $genname->new(articles=>$articles, cfg=>$cfg, top=>$article);
579 return $gen->generate_low($template, $article, $articles, 0);