blob: 5714c8ce55091dbd62d1e38e170fb83aeebe0a9f [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "modules/payments/PaymentTestHelper.h"
#include "bindings/core/v8/ScriptState.h"
#include "core/dom/Document.h"
#include "modules/payments/PaymentCurrencyAmount.h"
#include "modules/payments/PaymentMethodData.h"
#include "platform/heap/HeapAllocator.h"
namespace blink {
namespace {
static int gUniqueId = 0;
// PaymentItem and PaymentShippingOption have identical structure
// except for the "id" field, which is present only in PaymentShippingOption.
template <typename PaymentItemOrPaymentShippingOption>
void setValues(PaymentItemOrPaymentShippingOption& original, PaymentTestDataToChange data, PaymentTestModificationType modificationType, const String& valueToUse)
{
PaymentCurrencyAmount itemAmount;
if (data == PaymentTestDataCurrencyCode) {
if (modificationType == PaymentTestOverwriteValue)
itemAmount.setCurrency(valueToUse);
} else {
itemAmount.setCurrency("USD");
}
if (data == PaymentTestDataValue) {
if (modificationType == PaymentTestOverwriteValue)
itemAmount.setValue(valueToUse);
} else {
itemAmount.setValue("9.99");
}
if (data != PaymentTestDataAmount || modificationType != PaymentTestRemoveKey)
original.setAmount(itemAmount);
if (data == PaymentTestDataLabel) {
if (modificationType == PaymentTestOverwriteValue)
original.setLabel(valueToUse);
} else {
original.setLabel("Label");
}
}
} // namespace
PaymentItem buildPaymentItemForTest(PaymentTestDataToChange data, PaymentTestModificationType modificationType, const String& valueToUse)
{
DCHECK_NE(data, PaymentTestDataId);
PaymentItem item;
setValues(item, data, modificationType, valueToUse);
return item;
}
PaymentShippingOption buildShippingOptionForTest(PaymentTestDataToChange data, PaymentTestModificationType modificationType, const String& valueToUse)
{
PaymentShippingOption shippingOption;
if (data == PaymentTestDataId) {
if (modificationType == PaymentTestOverwriteValue)
shippingOption.setId(valueToUse);
} else {
shippingOption.setId("id" + String::number(gUniqueId++));
}
setValues(shippingOption, data, modificationType, valueToUse);
return shippingOption;
}
PaymentDetailsModifier buildPaymentDetailsModifierForTest(PaymentTestDetailToChange detail, PaymentTestDataToChange data, PaymentTestModificationType modificationType, const String& valueToUse)
{
PaymentItem total;
if (detail == PaymentTestDetailModifierTotal)
total = buildPaymentItemForTest(data, modificationType, valueToUse);
else
total = buildPaymentItemForTest();
PaymentItem item;
if (detail == PaymentTestDetailModifierItem)
item = buildPaymentItemForTest(data, modificationType, valueToUse);
else
item = buildPaymentItemForTest();
PaymentDetailsModifier modifier;
modifier.setSupportedMethods(Vector<String>(1, "foo"));
modifier.setTotal(total);
modifier.setAdditionalDisplayItems(HeapVector<PaymentItem>(1, item));
return modifier;
}
PaymentDetails buildPaymentDetailsForTest(PaymentTestDetailToChange detail, PaymentTestDataToChange data, PaymentTestModificationType modificationType, const String& valueToUse)
{
PaymentItem total;
if (detail == PaymentTestDetailTotal)
total = buildPaymentItemForTest(data, modificationType, valueToUse);
else
total = buildPaymentItemForTest();
PaymentItem item;
if (detail == PaymentTestDetailItem)
item = buildPaymentItemForTest(data, modificationType, valueToUse);
else
item = buildPaymentItemForTest();
PaymentShippingOption shippingOption;
if (detail == PaymentTestDetailShippingOption)
shippingOption = buildShippingOptionForTest(data, modificationType, valueToUse);
else
shippingOption = buildShippingOptionForTest();
PaymentDetailsModifier modifier;
if (detail == PaymentTestDetailModifierTotal || detail == PaymentTestDetailModifierItem)
modifier = buildPaymentDetailsModifierForTest(detail, data, modificationType, valueToUse);
else
modifier = buildPaymentDetailsModifierForTest();
PaymentDetails result;
result.setTotal(total);
result.setDisplayItems(HeapVector<PaymentItem>(1, item));
result.setShippingOptions(HeapVector<PaymentShippingOption>(1, shippingOption));
result.setModifiers(HeapVector<PaymentDetailsModifier>(1, modifier));
return result;
}
HeapVector<PaymentMethodData> buildPaymentMethodDataForTest()
{
HeapVector<PaymentMethodData> methodData(1, PaymentMethodData());
methodData[0].setSupportedMethods(Vector<String>(1, "foo"));
return methodData;
}
mojom::blink::PaymentResponsePtr buildPaymentResponseForTest()
{
mojom::blink::PaymentResponsePtr result = mojom::blink::PaymentResponse::New();
return result;
}
void makePaymentRequestOriginSecure(Document& document)
{
document.setSecurityOrigin(SecurityOrigin::create(KURL(KURL(), "https://www.example.com/")));
}
PaymentRequestMockFunctionScope::PaymentRequestMockFunctionScope(ScriptState* scriptState)
: m_scriptState(scriptState)
{
}
PaymentRequestMockFunctionScope::~PaymentRequestMockFunctionScope()
{
v8::MicrotasksScope::PerformCheckpoint(m_scriptState->isolate());
for (MockFunction* mockFunction : m_mockFunctions) {
testing::Mock::VerifyAndClearExpectations(mockFunction);
}
}
v8::Local<v8::Function> PaymentRequestMockFunctionScope::expectCall()
{
m_mockFunctions.append(new MockFunction(m_scriptState));
EXPECT_CALL(*m_mockFunctions.last(), call(testing::_));
return m_mockFunctions.last()->bind();
}
v8::Local<v8::Function> PaymentRequestMockFunctionScope::expectNoCall()
{
m_mockFunctions.append(new MockFunction(m_scriptState));
EXPECT_CALL(*m_mockFunctions.last(), call(testing::_)).Times(0);
return m_mockFunctions.last()->bind();
}
PaymentRequestMockFunctionScope::MockFunction::MockFunction(ScriptState* scriptState)
: ScriptFunction(scriptState)
{
ON_CALL(*this, call(testing::_)).WillByDefault(testing::ReturnArg<0>());
}
v8::Local<v8::Function> PaymentRequestMockFunctionScope::MockFunction::bind()
{
return bindToV8Function();
}
} // namespace blink