blob: ee2ad8cc5ad00fb2738e850fab9ea758ed9f0241 [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/PaymentResponse.h"
#include <memory>
#include <utility>
#include "bindings/core/v8/ExceptionState.h"
#include "bindings/core/v8/ScriptValue.h"
#include "bindings/core/v8/V8BindingForCore.h"
#include "bindings/core/v8/V8BindingForTesting.h"
#include "modules/payments/PaymentAddress.h"
#include "modules/payments/PaymentCompleter.h"
#include "modules/payments/PaymentTestHelper.h"
#include "platform/bindings/ScriptState.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
namespace {
class MockPaymentCompleter
: public GarbageCollectedFinalized<MockPaymentCompleter>,
public PaymentCompleter {
USING_GARBAGE_COLLECTED_MIXIN(MockPaymentCompleter);
WTF_MAKE_NONCOPYABLE(MockPaymentCompleter);
public:
MockPaymentCompleter() {
ON_CALL(*this, Complete(::testing::_, ::testing::_))
.WillByDefault(::testing::ReturnPointee(&dummy_promise_));
}
~MockPaymentCompleter() override {}
MOCK_METHOD2(Complete, ScriptPromise(ScriptState*, PaymentComplete result));
void Trace(blink::Visitor* visitor) {}
private:
ScriptPromise dummy_promise_;
};
TEST(PaymentResponseTest, DataCopiedOver) {
V8TestingScope scope;
payments::mojom::blink::PaymentResponsePtr input =
BuildPaymentResponseForTest();
input->method_name = "foo";
input->stringified_details = "{\"transactionId\": 123}";
input->shipping_option = "standardShippingOption";
input->payer_name = "Jon Doe";
input->payer_email = "abc@gmail.com";
input->payer_phone = "0123";
MockPaymentCompleter* complete_callback = new MockPaymentCompleter;
PaymentResponse* output =
new PaymentResponse(std::move(input), nullptr, complete_callback, "id");
EXPECT_EQ("foo", output->methodName());
EXPECT_EQ("standardShippingOption", output->shippingOption());
EXPECT_EQ("Jon Doe", output->payerName());
EXPECT_EQ("abc@gmail.com", output->payerEmail());
EXPECT_EQ("0123", output->payerPhone());
EXPECT_EQ("id", output->requestId());
ScriptValue details =
output->details(scope.GetScriptState(), scope.GetExceptionState());
ASSERT_FALSE(scope.GetExceptionState().HadException());
ASSERT_TRUE(details.V8Value()->IsObject());
ScriptValue transaction_id(
scope.GetScriptState(),
details.V8Value().As<v8::Object>()->Get(
V8String(scope.GetScriptState()->GetIsolate(), "transactionId")));
ASSERT_TRUE(transaction_id.V8Value()->IsNumber());
EXPECT_EQ(123, transaction_id.V8Value().As<v8::Number>()->Value());
}
TEST(PaymentResponseTest, PaymentResponseDetailsJSONObject) {
V8TestingScope scope;
payments::mojom::blink::PaymentResponsePtr input =
BuildPaymentResponseForTest();
input->stringified_details = "transactionId";
MockPaymentCompleter* complete_callback = new MockPaymentCompleter;
PaymentResponse* output =
new PaymentResponse(std::move(input), nullptr, complete_callback, "id");
ScriptValue details =
output->details(scope.GetScriptState(), scope.GetExceptionState());
ASSERT_TRUE(scope.GetExceptionState().HadException());
}
TEST(PaymentResponseTest, CompleteCalledWithSuccess) {
V8TestingScope scope;
payments::mojom::blink::PaymentResponsePtr input =
BuildPaymentResponseForTest();
input->method_name = "foo";
input->stringified_details = "{\"transactionId\": 123}";
MockPaymentCompleter* complete_callback = new MockPaymentCompleter;
PaymentResponse* output =
new PaymentResponse(std::move(input), nullptr, complete_callback, "id");
EXPECT_CALL(*complete_callback,
Complete(scope.GetScriptState(), PaymentCompleter::kSuccess));
output->complete(scope.GetScriptState(), "success");
}
TEST(PaymentResponseTest, CompleteCalledWithFailure) {
V8TestingScope scope;
payments::mojom::blink::PaymentResponsePtr input =
BuildPaymentResponseForTest();
input->method_name = "foo";
input->stringified_details = "{\"transactionId\": 123}";
MockPaymentCompleter* complete_callback = new MockPaymentCompleter;
PaymentResponse* output =
new PaymentResponse(std::move(input), nullptr, complete_callback, "id");
EXPECT_CALL(*complete_callback,
Complete(scope.GetScriptState(), PaymentCompleter::kFail));
output->complete(scope.GetScriptState(), "fail");
}
TEST(PaymentResponseTest, JSONSerializerTest) {
V8TestingScope scope;
payments::mojom::blink::PaymentResponsePtr input =
payments::mojom::blink::PaymentResponse::New();
input->method_name = "foo";
input->stringified_details = "{\"transactionId\": 123}";
input->shipping_option = "standardShippingOption";
input->payer_email = "abc@gmail.com";
input->payer_phone = "0123";
input->payer_name = "Jon Doe";
input->shipping_address = payments::mojom::blink::PaymentAddress::New();
input->shipping_address->country = "US";
input->shipping_address->language_code = "en";
input->shipping_address->script_code = "Latn";
input->shipping_address->address_line.push_back("340 Main St");
input->shipping_address->address_line.push_back("BIN1");
input->shipping_address->address_line.push_back("First floor");
PaymentAddress* address =
new PaymentAddress(std::move(input->shipping_address));
PaymentResponse* output = new PaymentResponse(std::move(input), address,
new MockPaymentCompleter, "id");
ScriptValue json_object = output->toJSONForBinding(scope.GetScriptState());
EXPECT_TRUE(json_object.IsObject());
String json_string = V8StringToWebCoreString<String>(
v8::JSON::Stringify(scope.GetContext(),
json_object.V8Value().As<v8::Object>())
.ToLocalChecked(),
kDoNotExternalize);
String expected =
"{\"requestId\":\"id\",\"methodName\":\"foo\",\"details\":{"
"\"transactionId\":123},"
"\"shippingAddress\":{\"country\":\"US\",\"addressLine\":[\"340 Main "
"St\","
"\"BIN1\",\"First "
"floor\"],\"region\":\"\",\"city\":\"\",\"dependentLocality\":"
"\"\",\"postalCode\":\"\",\"sortingCode\":\"\",\"languageCode\":\"en-"
"Latn\","
"\"organization\":\"\",\"recipient\":\"\",\"phone\":\"\"},"
"\"shippingOption\":"
"\"standardShippingOption\",\"payerName\":\"Jon Doe\","
"\"payerEmail\":\"abc@gmail.com\",\"payerPhone\":\"0123\"}";
EXPECT_EQ(expected, json_string);
}
} // namespace
} // namespace blink