227 lines
9 KiB
Perl
227 lines
9 KiB
Perl
#-------------------------------------------------------------------
|
|
# 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::Ad;
|
|
|
|
use Test::More;
|
|
use Test::Deep;
|
|
|
|
my $newAdSpaceSettings = {
|
|
name => "newAdSpaceName",
|
|
title => "Ad Space",
|
|
description => 'This is a space reserved for ads',
|
|
minimumImpressions => 100,
|
|
minimumClicks => 200,
|
|
width => "400",
|
|
height => "300",
|
|
};
|
|
|
|
my $numTests = 35; # increment this value for each test you create
|
|
$numTests += 2 * scalar keys %{ $newAdSpaceSettings };
|
|
++$numTests; ##For conditional testing on module load
|
|
|
|
plan tests => $numTests;
|
|
|
|
my $loaded = use_ok('WebGUI::AdSpace');
|
|
|
|
my $session = WebGUI::Test->session;
|
|
my ($adSpace, $alfred, $alfred2, $bruce, $catWoman, );
|
|
my ($jokerAd, $penguinAd, $twoFaceAd);
|
|
|
|
local $ENV{REMOTE_ADDR} = '10.0.0.1';
|
|
local $ENV{HTTP_USER_AGENT} = 'Mozilla/5.0';
|
|
|
|
$adSpace = WebGUI::AdSpace->create($session, {name=>"Alfred"});
|
|
|
|
isa_ok($adSpace, 'WebGUI::AdSpace');
|
|
WebGUI::Test->addToCleanup($adSpace);
|
|
|
|
my $data = $session->db->quickHashRef("select adSpaceId, name from adSpace where adSpaceId=?",[$adSpace->getId]);
|
|
|
|
ok(exists $data->{adSpaceId}, "create()");
|
|
is($data->{name}, $adSpace->get("name"), "get()");
|
|
is($data->{adSpaceId}, $adSpace->getId, "getId()");
|
|
|
|
$alfred = WebGUI::AdSpace->newByName($session, 'Alfred');
|
|
WebGUI::Test->addToCleanup($alfred);
|
|
|
|
cmp_deeply($adSpace, $alfred, 'newByName returns identical object if name exists');
|
|
|
|
$bruce = WebGUI::AdSpace->newByName($session, 'Bruce');
|
|
is($bruce, undef, 'newByName returns undef if the name does not exist');
|
|
|
|
$bruce = WebGUI::AdSpace->new($session, $session->getId);
|
|
is($bruce, undef, 'new returns undef if the id does not exist');
|
|
|
|
$alfred2 = WebGUI::AdSpace->create($session);
|
|
is($alfred2, undef, 'create returns undef unless you pass it a name');
|
|
|
|
$alfred2 = WebGUI::AdSpace->create($session, {name => 'Alfred'});
|
|
is($alfred2, undef, 'create returns undef if the name already exists');
|
|
|
|
isa_ok($alfred->session, 'WebGUI::Session');
|
|
|
|
undef $alfred2;
|
|
|
|
$alfred->set({title => "Alfred's Ad"});
|
|
is($alfred->get('title'), "Alfred's Ad", "get, set work on title");
|
|
|
|
$bruce = WebGUI::AdSpace->create($session, {name => 'Bruce'});
|
|
$bruce->set({title => "Bruce's Ad"});
|
|
WebGUI::Test->addToCleanup($bruce);
|
|
|
|
$catWoman = WebGUI::AdSpace->create($session, {name => 'CatWoman'});
|
|
$catWoman->set({title => "CatWoman's Ad"});
|
|
WebGUI::Test->addToCleanup($catWoman);
|
|
|
|
my $adSpaces = WebGUI::AdSpace->getAdSpaces($session);
|
|
|
|
cmp_deeply($adSpaces, [$alfred, $bruce, $catWoman], 'getAdSpaces returns all AdSpaces in alphabetical order by title');
|
|
|
|
$catWoman->set($newAdSpaceSettings);
|
|
|
|
foreach my $setting (keys %{ $newAdSpaceSettings } ) {
|
|
is($newAdSpaceSettings->{$setting}, $catWoman->get($setting),
|
|
sprintf "set and get for %s", $setting);
|
|
}
|
|
|
|
##Bare call to set doesn't change anything
|
|
$catWoman->set();
|
|
|
|
foreach my $setting (keys %{ $newAdSpaceSettings } ) {
|
|
is($newAdSpaceSettings->{$setting}, $catWoman->get($setting),
|
|
sprintf "empty call to set does not change %s", $setting);
|
|
}
|
|
|
|
$catWoman->set({title => '', name => '', description => '', });
|
|
is ($catWoman->get('title'), '', 'set can clear the title');
|
|
is ($catWoman->get('description'), '', 'set can clear the title');
|
|
is ($catWoman->get('name' ), $newAdSpaceSettings->{'name'}, 'set can not clear the name');
|
|
|
|
##Create a set of ads for general purpose testing
|
|
|
|
##The Joker and Penguin Ads go in the bruce adSpace
|
|
##The Two Face ad goes in the catWoman adSpace
|
|
|
|
$jokerAd = WebGUI::AdSpace::Ad->create($session, $bruce->getId,
|
|
{
|
|
title => 'Joker',
|
|
url => '/ha_ha',
|
|
type => 'rich',
|
|
richMedia => 'Joker',
|
|
priority => 2,
|
|
isActive => 1,
|
|
clicksBought => 0,
|
|
impressionsBought => 2,
|
|
}
|
|
);
|
|
$penguinAd = WebGUI::AdSpace::Ad->create($session, $bruce->getId,
|
|
{
|
|
title => 'Penguin',
|
|
url => '/fishy',
|
|
type => 'rich',
|
|
richMedia => 'Penguin',
|
|
priority => 1,
|
|
isActive => 1,
|
|
clicksBought => 4,
|
|
impressionsBought => 0,
|
|
}
|
|
);
|
|
$twoFaceAd = WebGUI::AdSpace::Ad->create($session, $catWoman->getId,
|
|
{
|
|
title => 'Two Face',
|
|
url => '/dent',
|
|
type => 'rich',
|
|
richMedia => 'Two Face',
|
|
priority => 500,
|
|
isActive => 1,
|
|
clicksBought => 0,
|
|
impressionsBought => 0,
|
|
}
|
|
);
|
|
|
|
##getAds
|
|
my @bruceAdTitles = map { $_->get('title') } @{ $bruce->getAds };
|
|
my @catWomanAdTitles = map { $_->get('title') } @{ $catWoman->getAds };
|
|
|
|
cmp_bag(\@bruceAdTitles, ['Joker', 'Penguin'], 'Got the set of Ads for bruce');
|
|
cmp_bag(\@catWomanAdTitles, ['Two Face'], 'Got the set of Ads for catWoman');
|
|
|
|
##countClicks
|
|
my $penguinUrl = WebGUI::AdSpace->countClick($session, $penguinAd->getId);
|
|
is($penguinUrl, $penguinAd->get('url'), 'clicking on the penguin ad returns the penguin url');
|
|
WebGUI::AdSpace->countClick($session, $penguinAd->getId);
|
|
WebGUI::AdSpace->countClick($session, $penguinAd->getId);
|
|
|
|
my $jokerUrl = WebGUI::AdSpace->countClick($session, $jokerAd->getId);
|
|
is($jokerUrl, $jokerAd->get('url'), 'clicking on the joker ad returns the joker url');
|
|
|
|
my $twoFaceUrl = WebGUI::AdSpace->countClick($session, $twoFaceAd->getId);
|
|
is($twoFaceUrl, $twoFaceAd->get('url'), 'clicking on the twoFace ad returns the twoFace url');
|
|
|
|
my ($penguinClicks) = $session->db->quickArray('select clicks from advertisement where adId=?',[$penguinAd->getId]);
|
|
is($penguinClicks, 3, 'counted penguin clicks correctly');
|
|
|
|
my ($jokerClicks) = $session->db->quickArray('select clicks from advertisement where adId=?',[$jokerAd->getId]);
|
|
is($jokerClicks, 1, 'counted joker clicks correctly');
|
|
|
|
my ($twoFaceClicks) = $session->db->quickArray('select clicks from advertisement where adId=?',[$twoFaceAd->getId]);
|
|
is($twoFaceClicks, 1, 'counted twoFace clicks correctly');
|
|
|
|
##displayImpression
|
|
my ($twoFaceImpressions, $twoFacePriority) =
|
|
$session->db->quickArray('select impressions,nextInPriority from advertisement where adId=?',[$twoFaceAd->getId]);
|
|
is($catWoman->displayImpression(1), $twoFaceAd->get('renderedAd'), 'displayImpression returns the ad');
|
|
cmp_bag(
|
|
[$twoFaceImpressions, $twoFacePriority],
|
|
[$session->db->quickArray('select impressions,nextInPriority from advertisement where adId=?',[$twoFaceAd->getId])],
|
|
'displayImpressions: impresssions and nextInPriority are not updated when dontCount=1',
|
|
);
|
|
|
|
$catWoman->displayImpression();
|
|
my $twoFaceTime = time();
|
|
is(
|
|
$session->db->quickArray('select impressions from advertisement where adId=?',[$twoFaceAd->getId]),
|
|
1, 'displayImpression added 1 impression'
|
|
);
|
|
my ($newTwoFacePriority) = $session->db->quickArray('select nextInPriority from advertisement where adId=?',[$twoFaceAd->getId]);
|
|
isnt($newTwoFacePriority, $twoFacePriority, 'displayImpression changed the nextInPriority');
|
|
cmp_ok(
|
|
abs($twoFaceTime + $twoFaceAd->get('priority') - $newTwoFacePriority),
|
|
'<=',
|
|
'2',
|
|
'displayImpression set the nextInPriority correctly'
|
|
);
|
|
|
|
my ($twoFaceIsActive) = $session->db->quickArray('select isActive from advertisement where adId=?',[$twoFaceAd->getId]);
|
|
is($twoFaceIsActive, 0, 'displayImpression deactivates an ad if enough impressions and clicks are bought');
|
|
|
|
$session->db->write('update advertisement set nextInPriority=UNIX_TIMESTAMP()+100000 where adId=?',[$jokerAd->getId]);
|
|
is($bruce->displayImpression(), $penguinAd->get('renderedAd'), 'displayImpression returns earliest by nextInPriority, penguin has 3 clicks');
|
|
WebGUI::AdSpace->countClick($session, $penguinAd->getId); ##4 clicks
|
|
is($bruce->displayImpression(), $penguinAd->get('renderedAd'), 'displayImpression returns still returns penguinAd, but deactivates it after 4 clicks');
|
|
|
|
my ($penguinActive) = $session->db->quickArray('select isActive from advertisement where adId=?',[$penguinAd->getId]);
|
|
is($penguinActive, 0, 'displayImpression deactiveated penguinAd');
|
|
is($bruce->displayImpression(), $jokerAd->get('renderedAd'), 'displayImpression now returns jokerAd');
|
|
|
|
my ($jokerActive) = $session->db->quickArray('select isActive from advertisement where adId=?',[$jokerAd->getId]);
|
|
is($jokerActive, 1, 'displayImpression did not deactiveate jokerAd after one impression');
|
|
|
|
$bruce->displayImpression();
|
|
($jokerActive) = $session->db->quickArray('select isActive from advertisement where adId=?',[$jokerAd->getId]);
|
|
is($jokerActive, 0, 'displayImpression deactivated jokerAd after two impressions');
|
|
|
|
#vim:ft=perl
|