user_info_fetcher_unittest.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/values.h"
6#include "components/policy/core/common/cloud/user_info_fetcher.h"
7#include "google_apis/gaia/gaia_oauth_client.h"
8#include "google_apis/gaia/google_service_auth_error.h"
9#include "net/http/http_status_code.h"
10#include "net/url_request/test_url_fetcher_factory.h"
11#include "testing/gmock/include/gmock/gmock.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14using testing::_;
15
16namespace policy {
17
18namespace {
19
20static const char kUserInfoResponse[] =
21    "{"
22    "  \"email\": \"test_user@test.com\","
23    "  \"verified_email\": true,"
24    "  \"domain\": \"test.com\""
25    "}";
26
27class MockUserInfoFetcherDelegate : public UserInfoFetcher::Delegate {
28 public:
29  MockUserInfoFetcherDelegate() {}
30  ~MockUserInfoFetcherDelegate() {}
31  MOCK_METHOD1(OnGetUserInfoFailure,
32               void(const GoogleServiceAuthError& error));
33  MOCK_METHOD1(OnGetUserInfoSuccess, void(const base::DictionaryValue* result));
34};
35
36MATCHER_P(MatchDict, expected, "matches DictionaryValue") {
37  return arg->Equals(expected);
38}
39
40class UserInfoFetcherTest : public testing::Test {
41 public:
42  UserInfoFetcherTest() {}
43  net::TestURLFetcherFactory url_factory_;
44};
45
46TEST_F(UserInfoFetcherTest, FailedFetch) {
47  MockUserInfoFetcherDelegate delegate;
48  UserInfoFetcher fetcher(&delegate, NULL);
49  fetcher.Start("access_token");
50
51  // Fake a failed fetch - should result in the failure callback being invoked.
52  EXPECT_CALL(delegate, OnGetUserInfoFailure(_));
53  net::TestURLFetcher* url_fetcher =
54      url_factory_.GetFetcherByID(gaia::GaiaOAuthClient::kUrlFetcherId);
55  url_fetcher->set_status(net::URLRequestStatus(
56      net::URLRequestStatus::FAILED, -1));
57  url_fetcher->delegate()->OnURLFetchComplete(url_fetcher);
58}
59
60TEST_F(UserInfoFetcherTest, SuccessfulFetch) {
61  MockUserInfoFetcherDelegate delegate;
62  UserInfoFetcher fetcher(&delegate, NULL);
63  fetcher.Start("access_token");
64
65  // Generate what we expect our result will look like (should match
66  // parsed kUserInfoResponse).
67  scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
68  dict->SetString("email", "test_user@test.com");
69  dict->SetBoolean("verified_email", true);
70  dict->SetString("domain", "test.com");
71
72  // Fake a successful fetch - should result in the data being parsed and
73  // the values passed off to the success callback.
74  EXPECT_CALL(delegate, OnGetUserInfoSuccess(MatchDict(dict.get())));
75  net::TestURLFetcher* url_fetcher =
76      url_factory_.GetFetcherByID(gaia::GaiaOAuthClient::kUrlFetcherId);
77  url_fetcher->set_response_code(net::HTTP_OK);
78  url_fetcher->SetResponseString(kUserInfoResponse);
79  url_fetcher->delegate()->OnURLFetchComplete(url_fetcher);
80}
81}  // namespace
82
83}  // namespace policy
84