package Yahoo::Marketing::APT::Test::SiteClassificationService;
# Copyright (c) 2009 Yahoo! Inc.  All rights reserved.
# The copyrights to the contents of this file are licensed under the Perl Artistic License (ver. 15 Aug 1997)

use strict; use warnings;

use base qw/ Yahoo::Marketing::APT::Test::PostTest /;
use Test::More;
use utf8;

use Yahoo::Marketing::APT::SiteClassificationService;
use Yahoo::Marketing::APT::Site;
use Yahoo::Marketing::APT::CustomContentCategory;
use Yahoo::Marketing::APT::CustomSection;

use Data::Dumper;

# use SOAP::Lite +trace => [qw/ debug method fault /];


sub SKIP_CLASS {
    my $self = shift;
    # 'not running post tests' is a true value
    return 'not running post tests' unless $self->run_post_tests;
    return;
}

sub section {
    my ( $self ) = @_;
    return $self->SUPER::section().'_managed_publisher';
}

sub startup_test_site_service : Test(startup) {
    my ( $self ) = @_;

    $self->common_test_data( 'test_site', $self->create_site ) unless defined $self->common_test_data( 'test_site' );
    $self->common_test_data( 'test_sites', [$self->create_sites] ) unless defined $self->common_test_data( 'test_sites' );
}

sub shutdown_test_site_service : Test(shutdown) {
    my ( $self ) = @_;

    $self->cleanup_site;
    $self->cleanup_sites;
}


sub test_can_operate_custom_content_category : Test(10) {
    my $self = shift;

    my $ysm_ws = Yahoo::Marketing::APT::SiteClassificationService->new->parse_config( section => $self->section );

    my $site = $self->common_test_data( 'test_site' );

    my $custom_content_category = Yahoo::Marketing::APT::CustomContentCategory->new
                                                                              ->name( 'test cat' )
                                                                              ->siteID( $site->ID )
                                                                                  ;
    # test addCustomContentCategory
    my $response = $ysm_ws->addCustomContentCategory(
        customContentCategory => $custom_content_category,
    );

    ok( $response, 'can call addCustomContentCategory' );
    is( $response->operationSucceeded, 'true', 'add custom content category successfully' );
    is( $response->category->name, 'test cat', 'name matches' );

    $custom_content_category = $response->category;

    # test getCustomContentCategory
    my $fetched_category = $ysm_ws->getCustomContentCategory( customContentCategoryID => $custom_content_category->ID );

    ok( $fetched_category, 'can call getCustomContentCategory' );
    is( $fetched_category->siteID, $custom_content_category->siteID, 'siteID matches' );

    # test updateCustomContentCategory
    $response = $ysm_ws->updateCustomContentCategory( customContentCategory => $fetched_category->name( 'new cat' ) );
    ok($response, 'can call updateCustomContentCategory' );
    is( $response->operationSucceeded, 'true', 'update custom content category successfully' );
    is( $response->category->name, 'new cat', 'name updated' );

    # test deleteCustomContentCategory
    $response = $ysm_ws->deleteCustomContentCategory( customContentCategoryID => $fetched_category->ID );
    ok( $response, 'can call deleteCustomContentCategory' );
    is( $response->operationSucceeded, 'true', 'delete custom content category successfully' );

}


sub test_can_operate_custom_content_categories : Test(12) {
    my $self = shift;

    my $ysm_ws = Yahoo::Marketing::APT::SiteClassificationService->new->parse_config( section => $self->section );

    my @sites = @{ $self->common_test_data( 'test_sites' ) };

    my @categories;
    foreach my $site (@sites) {
        my $custom_content_category = Yahoo::Marketing::APT::CustomContentCategory->new
                                                                                  ->name( "test cat ".$$ )
                                                                                  ->siteID( $site->ID )
                                                                                      ;
        push @categories, $custom_content_category;
    }

    # test addCustomContentCategories
    my @responses = $ysm_ws->addCustomContentCategories(
        customContentCategories => \@categories,
    );

    ok( @responses, 'can call addCustomContentCategories' );
    is( $responses[0]->operationSucceeded, 'true', 'add custom content category successfully' );
    like( $responses[0]->category->name, qr/^test cat/, 'name matches' );

    @categories = map { $_->category } @responses;

    # test getCustomContentCategories
    my @fetched_categories = $ysm_ws->getCustomContentCategories( customContentCategoryIDs => [map {$_->ID} @categories] );

    ok( @fetched_categories, 'can call getCustomContentCategories' );
    like( $fetched_categories[0]->name, qr/^test cat/, 'name matches' );

    # test updateCustomContentCategories
    @fetched_categories = map { $_->description( 'test desc' ) } @fetched_categories;
    @responses = $ysm_ws->updateCustomContentCategories( customContentCategories => \@fetched_categories );

    ok( @responses, 'can call updateCustomContentCategories' );
    is( $responses[0]->operationSucceeded, 'true', 'update custom content categories successfully' );
    is( $responses[0]->category->description, 'test desc', 'description updated' );

    # test getCustomContentCategoriesBySiteID
    my @current_categories = $ysm_ws->getCustomContentCategoriesBySiteID( siteID => $sites[0]->ID );
    ok( @current_categories, 'can call getCustomContentCategoriesBySiteID' );
    is( $current_categories[0]->siteID, $sites[0]->ID, 'site id matches' );

    # test deleteCustomContentCategories
    @responses = $ysm_ws->deleteCustomContentCategories( customContentCategoryIDs => [map {$_->ID} @fetched_categories] );
    ok( @responses, 'can call deleteCustomContentCategories' );
    is( $responses[0]->operationSucceeded, 'true', 'delete custom content categories successfully' );

}


sub test_can_operate_custom_section : Test(10) {
    my $self = shift;

    my $ysm_ws = Yahoo::Marketing::APT::SiteClassificationService->new->parse_config( section => $self->section );

    my $site = $self->common_test_data( 'test_site' );

    my $custom_section = Yahoo::Marketing::APT::CustomSection->new
                                                             ->name( 'test section' )
                                                             ->siteID( $site->ID )
                                                                 ;
    # test addCustomSection
    my $response = $ysm_ws->addCustomSection(
        customSection => $custom_section,
    );

    ok( $response, 'can call addCustomSection' );
    is( $response->operationSucceeded, 'true', 'add custom section successfully' );
    is( $response->customSection->name, 'test section', 'name matches' );

    $custom_section = $response->customSection;

    # test getCustomSection
    my $fetched_section = $ysm_ws->getCustomSection( customSectionID => $custom_section->ID );

    ok( $fetched_section, 'can call getCustomSection' );
    is( $fetched_section->siteID, $custom_section->siteID, 'siteID matches' );

    # test updateCustomSection
    $response = $ysm_ws->updateCustomSection( customSection => $fetched_section->name( 'new section' ) );
    ok($response, 'can call updateCustomSection' );
    is( $response->operationSucceeded, 'true', 'update custom section successfully' );
    is( $response->customSection->name, 'new section', 'name updated' );

    # test deleteCustomSection
    $response = $ysm_ws->deleteCustomSection( customSectionID => $fetched_section->ID );
    ok( $response, 'can call deleteCustomSection' );
    is( $response->operationSucceeded, 'true', 'delete custom section successfully' );

}


sub test_can_operate_custom_sections : Test(12) {
    my $self = shift;

    my $ysm_ws = Yahoo::Marketing::APT::SiteClassificationService->new->parse_config( section => $self->section );

    my @sites = @{ $self->common_test_data( 'test_sites' ) };

    my @sections;
    foreach my $site (@sites) {
        my $custom_section = Yahoo::Marketing::APT::CustomSection->new
                                                                 ->name( "test section ".$$ )
                                                                 ->siteID( $site->ID )
                                                                     ;
        push @sections, $custom_section;
    }

    # test addCustomSections
    my @responses = $ysm_ws->addCustomSections(
        customSections => \@sections,
    );

    ok( @responses, 'can call addCustomSections' );
    is( $responses[0]->operationSucceeded, 'true', 'add custom sections successfully' );
    like( $responses[0]->customSection->name, qr/^test section/, 'name matches' );

    @sections = map { $_->customSection } @responses;

    # test getCustomSections
    my @fetched_sections = $ysm_ws->getCustomSections( customSectionIDs => [map {$_->ID} @sections] );

    ok( @fetched_sections, 'can call getCustomSections' );
    like( $fetched_sections[0]->name, qr/^test section/, 'name matches' );

    # test updateCustomSections
    @fetched_sections = map { $_->description( 'test desc' ) } @fetched_sections;
    @responses = $ysm_ws->updateCustomSections( customSections => \@fetched_sections );

    ok( @responses, 'can call updateCustomSections' );
    is( $responses[0]->operationSucceeded, 'true', 'update custom sections successfully' );
    is( $responses[0]->customSection->description, 'test desc', 'description updated' );

    # test getCustomSectionsBySiteID
    my @current_sections = $ysm_ws->getCustomSectionsBySiteID( siteID => $sites[0]->ID );
    ok( @current_sections, 'can call getCustomSectionsBySiteID' );
    is( $current_sections[0]->siteID, $sites[0]->ID, 'site id matches' );

    # test deleteCustomSections
    @responses = $ysm_ws->deleteCustomSections( customSectionIDs => [map {$_->ID} @fetched_sections] );
    ok( @responses, 'can call deleteCustomSections' );
    is( $responses[0]->operationSucceeded, 'true', 'delete custom sections successfully' );

}


1;

