#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2009 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#-------------------------------------------------------------------
# http://www.plainblack.com                     info@plainblack.com
#-------------------------------------------------------------------

use FindBin;
use strict;
use lib "$FindBin::Bin/../lib";
use WebGUI::Test;
use WebGUI::Session;
use WebGUI::AdSpace;

use Test::More;
use Test::Deep;
use HTML::TokeParser;

my $newAdSettings = {
    title             => "Untitled",
    clicksBought      => 0, ##From db
    impressionsBought => 0, ##From db
    url               => undef,
    adText            => undef,
    storageId         => undef,
    richMedia         => undef,
    ownerUserId       => "3",
    isActive          => 0, ##From db
    type              => "text",
    borderColor       => "#000000",
    textColor         => "#000000",
    backgroundColor   => "#ffffff",
    priority          => "0",
};

my $numTests = 33; # increment this value for each test you create
$numTests += scalar keys %{ $newAdSettings };
++$numTests; ##For conditional testing on module load

plan tests => $numTests;

my $loaded = use_ok('WebGUI::AdSpace::Ad');

my $session = WebGUI::Test->session;
my $ad;
my ($richAd, $textAd, $imageAd, $nonAd, $setAd);
my $imageStorage = WebGUI::Storage->create($session);
WebGUI::Test->addToCleanup($imageStorage);
$imageStorage->addFileFromScalar('foo.bmp', 'This is not really an image');


local $ENV{REMOTE_ADDR} = '10.0.0.1';
local $ENV{HTTP_USER_AGENT} = 'Mozilla/5.0';

my $adSpace = WebGUI::AdSpace->create($session, {name=>"Tim Robbins"});
WebGUI::Test->addToCleanup($adSpace);
$ad=WebGUI::AdSpace::Ad->create($session, $adSpace->getId, {"type" => "text"});
isa_ok($ad,"WebGUI::AdSpace::Ad");

isa_ok($ad->session, 'WebGUI::Session');
is($ad->get('type'), 'text', 'property set during object creation');

my $ad2 = WebGUI::AdSpace::Ad->new($session, $ad->getId);
cmp_deeply($ad2, $ad, "new returns an identical object to the original what was created");

undef $ad2;

my $data = $session->db->quickHashRef("select adId, adSpaceId from advertisement where adId=?",[$ad->getId]);

ok(exists $data->{adId}, "create()");
is($data->{adId}, $ad->getId, "getId()");
is($data->{adSpaceId}, $ad->get('adSpaceId'), "get() adSpaceId");

foreach my $setting (keys %{ $newAdSettings } ) {
    is($newAdSettings->{$setting}, $ad->get($setting),
        sprintf "default setting for %s", $setting);
}

$richAd = WebGUI::AdSpace::Ad->create($session, $adSpace->getId);
$richAd->set({
    type      => 'rich',
    richMedia => 'This is rich, ^@;'
});
my $renderedAd = $richAd->get('renderedAd');
my $userName = $session->user->username;
like($renderedAd, qr/This is rich, $userName/, 'Rich media ads render macros');

##In this series of tests, we'll render a text ad and then pick it apart and make
##sure that all the requisite components are in there.
$adSpace->set({
    width => 102,
    height => 202
});

$textAd = WebGUI::AdSpace::Ad->create($session, $adSpace->getId);
$textAd->set({
    type        => 'text',
    borderColor => 'black',
    backgroundColor => 'white',
    textColor => 'blue',
    title => 'This is a text ad',
    adText => 'Will hack for Gooey dolls.',
});
my $renderedTextAd = $textAd->get('renderedAd');

my $textP = HTML::TokeParser->new(\$renderedTextAd);

##Outer div checks
my $token = $textP->get_tag("div");
my $style = $token->[1]{style};
like($style, qr/height:200/,          'adSpace height rendered correctly');
like($style, qr/width:100/,           'adSpace width rendered correctly');
like($style, qr/border:solid black/,  'ad borderColor rendered correctly');

##Link checks
$token = $textP->get_tag("a");
my $href = $token->[1]{onclick};
like($href, qr/op=clickAd/,               'ad link has correct operation');

my $adId = $textAd->getId;
like($href, qr/id=\Q$adId\E/,             'ad link has correct ad id');

$style = $token->[1]{style};
like($style, qr/background-color:white/,  'ad link background is white');

$token = $textP->get_tag("span");
$style = $token->[1]{style};
like($style, qr/color:blue/,              'ad title text foreground is blue');

$token = $textP->get_tag("span");
$style = $token->[1]{style};
like($style, qr/color:blue/,              'ad title text foreground is blue');

my $adText = $textP->get_trimmed_text('/span');
is($adText, $textAd->get('adText'),       'ad text is correct');

##Ditto for the image ad
$adSpace->set({
    width  => 250,
    height => 250
});

$imageAd = WebGUI::AdSpace::Ad->create($session, $adSpace->getId);
$imageAd->set({
    type       => 'image',
    title      => 'This is an image ad',
    storageId  => $imageStorage->getId,
});
my $renderedImageAd = $imageAd->get('renderedAd');

my $textP = HTML::TokeParser->new(\$renderedImageAd);

##Outer div checks
my $token = $textP->get_tag("div");
my $style = $token->[1]{style};
like($style, qr/height:250/,          'adSpace height rendered correctly, image');
like($style, qr/width:250/,           'adSpace width rendered correctly, image');

##Link checks
$token = $textP->get_tag("a");
my $href = $token->[1]{onclick};
like($href, qr/op=clickAd/,               'ad link has correct operation, image');

$adId = $imageAd->getId;
like($href, qr/id=\Q$adId\E/,             'ad link has correct ad id, image');

$token = $textP->get_tag("img");
$style = $token->[1]{src};
is($style, $imageStorage->getUrl($imageStorage->getFiles->[0]), 'ad image points at correct file');
$style = $token->[1]{alt};
is($style, $imageAd->get('title'), 'ad title matches, image');

my $nonAdProperties = {
    type       => 'nothing',
    title      => 'This ad will never render',
};
$nonAd = WebGUI::AdSpace::Ad->create($session, $adSpace->getId, $nonAdProperties);
my $renderedNonAd = $nonAd->get('renderedAd');

is($renderedNonAd, undef, 'undefined ad types are not rendered');

$nonAd->delete;

$nonAd = WebGUI::AdSpace::Ad->new($session, 'nonExistantId');
is($nonAd, undef, 'requesting a non-existant id via new returns undef');

my $setAd = WebGUI::AdSpace::Ad->create($session, $adSpace->getId, {isActive => 1});
is($setAd->get('isActive'), 1, 'set isActive true during instantiation');
$setAd->set({isActive=>0});
is($setAd->get('isActive'), 0, 'set isActive false during instantiation');
$setAd->delete;

my $setAd = WebGUI::AdSpace::Ad->create($session, $adSpace->getId, {priority => 1});
is($setAd->get('priority'), 1, 'set priority=1 during instantiation');
$setAd->set({priority=>0});
is($setAd->get('priority'), 0, 'set priority=0');

$setAd->set({ title => 'myTitle', url => 'http://www.nowhere.com', adText => 'Performing a valuable service for the community'});
is($setAd->get('url'),    'http://www.nowhere.com',                          'set: url');
is($setAd->get('adText'), 'Performing a valuable service for the community', 'set: adText');

$setAd->set({ url => '', adText => ''});
is($setAd->get('url'),    '', 'set: clearing url');
is($setAd->get('adText'), '', 'set: clearing adText');

#vim:ft=perl
