#!perl
if
(-d
'schemas'
) {
plan
tests
=> 51;
}
else
{
plan
skip_all
=>
q{Missing "schemas" directory with the xsd from Amazon, skipping feeds tests}
;
}
my
$writer
= XML::Compile::Schema->new([
glob
File::Spec->catfile(
'schemas'
,
'*.xsd'
)])
->compile(
WRITER
=>
'AmazonEnvelope'
);
my
@products
;
foreach
my
$product
({
sku
=>
'1234'
,
ean
=>
'1234123412343'
,
brand
=>
'blabla'
,
title
=>
'title'
,
price
=>
'10.00'
,
description
=>
'my desc'
,
category_code
=>
'111111'
,
product_data
=> {
CE
=> {
ProductType
=> {
PhoneAccessory
=> {} } } },
manufacturer
=>
'A manufacturer'
,
manufacturer_part_number
=>
'1234123412343'
,
condition
=>
'Refurbished'
,
condition_note
=>
'Looks like new'
,
inventory
=> 1,
search_terms
=> [
qw/a b c d e f g/
],
features
=> [
qw/f1 f2 f3/
,
''
,
qw/f4 f5 f6 f7/
],
shipping_weight
=>
'5'
,
shipping_weight_unit
=>
'GR'
,
package_weight
=> 290,
},
{
sku
=>
'3333'
,
ean
=>
'4444123412343'
,
brand
=>
'brand'
,
title
=>
'title2'
,
price
=>
'12.00'
,
description
=>
'my desc 2'
,
category_code
=>
'111111'
,
product_data
=> {
Sports
=> {
ProductType
=>
'SportingGoods'
} },
manufacturer_part_number
=>
'4444123412343'
,
inventory
=> 2,
shipping_weight
=> 0,
package_weight
=> 0,
}) {
push
@products
, Amazon::MWS::XML::Product->new(
%$product
);
}
my
$feeder
= Amazon::MWS::XML::Feed->new(
products
=> \
@products
,
xml_writer
=>
$writer
,
merchant_id
=>
'__MERCHANT_ID__'
,
);
my
$exp_product_feed
=
<<'XML';
<?xml version="1.0" encoding="UTF-8"?>
<AmazonEnvelope>
<Header>
<DocumentVersion>1.1</DocumentVersion>
<MerchantIdentifier>__MERCHANT_ID__</MerchantIdentifier>
</Header>
<MessageType>Product</MessageType>
<Message>
<MessageID>1</MessageID>
<OperationType>Update</OperationType>
<Product>
<SKU>1234</SKU>
<StandardProductID>
<Type>EAN</Type>
<Value>1234123412343</Value>
</StandardProductID>
<Condition>
<ConditionType>Refurbished</ConditionType>
<ConditionNote>Looks like new</ConditionNote>
</Condition>
<DescriptionData>
<Title>title</Title>
<Brand>blabla</Brand>
<Description>my desc</Description>
<BulletPoint>f1</BulletPoint>
<BulletPoint>f2</BulletPoint>
<BulletPoint>f3</BulletPoint>
<BulletPoint>f4</BulletPoint>
<BulletPoint>f5</BulletPoint>
<PackageWeight unitOfMeasure="GR">290</PackageWeight>
<ShippingWeight unitOfMeasure="GR">5</ShippingWeight>
<Manufacturer>A manufacturer</Manufacturer>
<MfrPartNumber>1234123412343</MfrPartNumber>
<SearchTerms>a</SearchTerms>
<SearchTerms>b</SearchTerms>
<SearchTerms>c</SearchTerms>
<SearchTerms>d</SearchTerms>
<SearchTerms>e</SearchTerms>
<RecommendedBrowseNode>111111</RecommendedBrowseNode>
</DescriptionData>
<ProductData>
<CE>
<ProductType>
<PhoneAccessory/>
</ProductType>
</CE>
</ProductData>
</Product>
</Message>
<Message>
<MessageID>2</MessageID>
<OperationType>Update</OperationType>
<Product>
<SKU>3333</SKU>
<StandardProductID>
<Type>EAN</Type>
<Value>4444123412343</Value>
</StandardProductID>
<Condition>
<ConditionType>New</ConditionType>
</Condition>
<DescriptionData>
<Title>title2</Title>
<Brand>brand</Brand>
<Description>my desc 2</Description>
<MfrPartNumber>4444123412343</MfrPartNumber>
<RecommendedBrowseNode>111111</RecommendedBrowseNode>
</DescriptionData>
<ProductData>
<Sports>
<ProductType>SportingGoods</ProductType>
</Sports>
</ProductData>
</Product>
</Message>
</AmazonEnvelope>
XML
my
$exp_inventory_feed
=
<<'XML';
<?xml version="1.0" encoding="UTF-8"?>
<AmazonEnvelope>
<Header>
<DocumentVersion>1.1</DocumentVersion>
<MerchantIdentifier>__MERCHANT_ID__</MerchantIdentifier>
</Header>
<MessageType>Inventory</MessageType>
<Message>
<MessageID>1</MessageID>
<OperationType>Update</OperationType>
<Inventory>
<SKU>1234</SKU>
<Quantity>1</Quantity>
<FulfillmentLatency>2</FulfillmentLatency>
</Inventory>
</Message>
<Message>
<MessageID>2</MessageID>
<OperationType>Update</OperationType>
<Inventory>
<SKU>3333</SKU>
<Quantity>2</Quantity>
<FulfillmentLatency>2</FulfillmentLatency>
</Inventory>
</Message>
</AmazonEnvelope>
XML
my
$exp_price_feed
=
<<'XML';
<?xml version="1.0" encoding="UTF-8"?>
<AmazonEnvelope>
<Header>
<DocumentVersion>1.1</DocumentVersion>
<MerchantIdentifier>__MERCHANT_ID__</MerchantIdentifier>
</Header>
<MessageType>Price</MessageType>
<Message>
<MessageID>1</MessageID>
<OperationType>Update</OperationType>
<Price>
<SKU>1234</SKU>
<StandardPrice currency="EUR">10.00</StandardPrice>
</Price>
</Message>
<Message>
<MessageID>2</MessageID>
<OperationType>Update</OperationType>
<Price>
<SKU>3333</SKU>
<StandardPrice currency="EUR">12.00</StandardPrice>
</Price>
</Message>
</AmazonEnvelope>
XML
my
$exp_image_feed
=
<<'XML';
<?xml version="1.0" encoding="UTF-8"?>
<AmazonEnvelope>
<Header>
<DocumentVersion>1.1</DocumentVersion>
<MerchantIdentifier>__MERCHANT_ID__</MerchantIdentifier>
</Header>
<MessageType>ProductImage</MessageType>
<Message>
<MessageID>1</MessageID>
<OperationType>Update</OperationType>
<ProductImage>
<SKU>1234</SKU>
<ImageType>Main</ImageType>
</ProductImage>
</Message>
<Message>
<MessageID>2</MessageID>
<OperationType>Update</OperationType>
<ProductImage>
<SKU>3333</SKU>
<ImageType>Main</ImageType>
</ProductImage>
</Message>
</AmazonEnvelope>
XML
my
$exp_variants_feed
;
is (
$feeder
->product_feed,
$exp_product_feed
,
"product feed ok"
);
is (
$feeder
->inventory_feed,
$exp_inventory_feed
,
"inventory feed ok"
);
is (
$feeder
->price_feed,
$exp_price_feed
,
"price feed ok"
);
is (
$feeder
->image_feed,
$exp_image_feed
,
"image feed ok"
);
is (
$feeder
->variants_feed,
$exp_variants_feed
,
"variants feed ok (undef)"
);
my
$test
= Amazon::MWS::XML::Product->new(
sku
=>
'12345'
,
price
=>
'10'
,
ean
=>
'4444123412343'
,
condition
=>
'UsedAcceptable'
);
is
$test
->condition,
'UsedAcceptable'
;
is
$test
->condition_type_for_lowest_price_listing,
'Used'
;
my
%testconstructor
= (
sku
=>
'3333'
,
ean
=>
'4444123412343'
,
brand
=>
'brand'
,
title
=>
'title2'
,
price
=>
'12.00'
,
description
=>
'my desc 2'
,
category_code
=>
'111111'
,
category
=>
'CE'
,
subcategory
=>
'PhoneAccessory'
,
manufacturer_part_number
=>
'4444123412343'
,
inventory
=> 2,
manufacturer
=>
''
,
);
$testconstructor
{condition} =
'blablabla'
;
eval
{
$test
= Amazon::MWS::XML::Product->new(
%testconstructor
); };
like $@,
qr/condition/
,
"Found exception for garbage in condition"
;
delete
$testconstructor
{condition};
$testconstructor
{manufacturer} =
'abc'
x 50;
eval
{
$test
= Amazon::MWS::XML::Product->new(
%testconstructor
); };
like $@,
qr/Max characters is 50/
,
"Found exception when manufacturer is too long"
;
delete
$testconstructor
{manufacturer};
$testconstructor
{ean} =
'1'
x 7;
eval
{
$test
= Amazon::MWS::XML::Product->new(
%testconstructor
) };
like $@,
qr/Min characters is 8/
,
"Found exception when ean is not long enough"
;
$testconstructor
{ean} =
'1'
x 17;
eval
{
$test
= Amazon::MWS::XML::Product->new(
%testconstructor
) };
like $@,
qr/Max characters is 16/
,
"Found exception when ean is not long enough"
;
$testconstructor
{ean} =
'1'
x 8;
eval
{
$test
= Amazon::MWS::XML::Product->new(
%testconstructor
) };
ok (!$@,
"No exception"
);
$testconstructor
{ean} =
'1'
x 16;
eval
{
$test
= Amazon::MWS::XML::Product->new(
%testconstructor
) };
ok (!$@,
"No exception"
);
$testconstructor
{ean} =
'4444123412343'
;
eval
{
$test
= Amazon::MWS::XML::Product->new(
%testconstructor
) };
ok (!$@,
"No exception"
);
$feeder
= Amazon::MWS::XML::Feed->new(
products
=> [
$test
],
xml_writer
=>
$writer
,
merchant_id
=>
'__MERCHANT_ID__'
,
);
unlike(
$feeder
->product_feed,
qr/<Manufacturer>/
,
"No manufacturer found in the feed"
);
diag
$feeder
->product_feed;
$test
= Amazon::MWS::XML::Product->new(
sku
=>
'12345'
,
price
=>
'10'
,
ean
=>
'4444123412343'
,
condition
=>
'UsedAcceptable'
);
ok(!
$test
->price_is_zero);
eval
{
$test
= Amazon::MWS::XML::Product->new(
sku
=>
'12345'
,
price
=>
'-10'
,
ean
=>
'4444123412343'
,
condition
=>
'UsedAcceptable'
);
};
like $@,
qr/is negative/
,
"Exception with negative price: $@"
;
$test
= Amazon::MWS::XML::Product->new(
sku
=>
'12345'
,
price
=>
'0.000000'
,
ean
=>
'4444123412343'
,
inventory
=> 10,
images
=> [
'a.jpg'
],
children
=> [
'123414-XXL'
],
condition
=>
'New'
);
ok(
$test
->price_is_zero);
ok(
$test
->is_inactive);
is(
$test
->as_price_hash,
undef
,
"zero priced item gets no price feed"
);
is(
$test
->inventory, 10);
is(
$test
->as_inventory_hash->{Quantity}, 0,
"zero priced items get an inventory of 0"
);
is(
$test
->as_images_array,
undef
,
"zero priced items gets no image feed"
);
is(
$test
->as_variants_hash,
undef
,
"zero priced items gets no variant feed"
);
$feeder
= Amazon::MWS::XML::Feed->new(
products
=> [
$test
],
xml_writer
=>
$writer
,
merchant_id
=>
'__MERCHANT_ID__'
,
);
like(
$feeder
->product_feed,
qr/SKU>12345</
,
"Product feed found"
);
like(
$feeder
->inventory_feed,
qr/Quantity>0</
,
"Quantity found"
);
ok(!
$feeder
->price_feed,
"No price feed"
);
ok(!
$feeder
->image_feed,
"No image feed"
);
ok(!
$feeder
->variants_feed,
"No variant feed"
);
$test
= Amazon::MWS::XML::Product->new(
sku
=>
'12345'
,
price
=>
'100'
,
ean
=>
'4444123412343'
,
inventory
=> -1,
images
=> [
'a.jpg'
],
children
=> [
'123414-XXL'
],
condition
=>
'New'
);
ok(!
$test
->price_is_zero);
ok(
$test
->is_inactive);
is(
$test
->as_price_hash,
undef
,
"inactive items get no price feed"
);
is(
$test
->inventory, -1);
is(
$test
->as_inventory_hash->{Quantity}, 0,
"inactive items get an inventory of 0"
);
is(
$test
->as_images_array,
undef
,
"inactive items gets no image feed"
);
is(
$test
->as_variants_hash,
undef
,
"inactive items gets no variant feed"
);
$feeder
= Amazon::MWS::XML::Feed->new(
products
=> [
$test
],
xml_writer
=>
$writer
,
merchant_id
=>
'__MERCHANT_ID__'
,
);
like(
$feeder
->product_feed,
qr/SKU>12345</
,
"Product feed found"
);
like(
$feeder
->inventory_feed,
qr/Quantity>0</
,
"Quantity found"
);
ok(!
$feeder
->price_feed,
"No price feed"
);
ok(!
$feeder
->image_feed,
"No image feed"
);
ok(!
$feeder
->variants_feed,
"No variant feed"
);
$test
->feeds_needed([]);
$feeder
= Amazon::MWS::XML::Feed->new(
products
=> [
$test
],
xml_writer
=>
$writer
,
merchant_id
=>
'__MERCHANT_ID__'
,
);
ok(!
$feeder
->product_feed,
"No product feed found"
);
ok(!
$feeder
->inventory_feed,
"No quantity found"
);
ok(!
$feeder
->price_feed,
"No price feed"
);
ok(!
$feeder
->image_feed,
"No image feed"
);
ok(!
$feeder
->variants_feed,
"No variant feed"
);
$test
->feeds_needed([
qw/inventory/
]);
$feeder
= Amazon::MWS::XML::Feed->new(
products
=> [
$test
],
xml_writer
=>
$writer
,
merchant_id
=>
'__MERCHANT_ID__'
,
);
ok(!
$feeder
->product_feed,
"No product feed found"
);
ok(
$feeder
->inventory_feed,
"Inventory found"
);
ok(!
$feeder
->price_feed,
"No price feed"
);
ok(!
$feeder
->image_feed,
"No image feed"
);
ok(!
$feeder
->variants_feed,
"No variant feed"
);