You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 lines
5.9 KiB

# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import os
from google.appengine.ext import ndb
from google.appengine.ext import testbed
import mock
import unittest2
from oauth2client import client
from oauth2client.contrib import appengine
DATA_DIR = os.path.join(os.path.dirname(__file__), '..', 'data')
def datafile(filename):
return os.path.join(DATA_DIR, filename)
class TestNDBModel(ndb.Model):
flow = appengine.FlowNDBProperty()
creds = appengine.CredentialsNDBProperty()
class TestFlowNDBProperty(unittest2.TestCase):
def setUp(self):
self.testbed = testbed.Testbed()
self.testbed.activate()
self.testbed.init_datastore_v3_stub()
self.testbed.init_memcache_stub()
def tearDown(self):
self.testbed.deactivate()
def test_flow_get_put(self):
instance = TestNDBModel(
flow=client.flow_from_clientsecrets(
datafile('client_secrets.json'), 'foo', redirect_uri='oob'),
id='foo'
)
instance.put()
retrieved = TestNDBModel.get_by_id('foo')
self.assertEqual('foo_client_id', retrieved.flow.client_id)
@mock.patch('oauth2client.contrib._appengine_ndb._LOGGER')
def test_validate_success(self, mock_logger):
flow_prop = TestNDBModel.flow
flow_val = client.flow_from_clientsecrets(
datafile('client_secrets.json'), 'foo', redirect_uri='oob')
flow_prop._validate(flow_val)
mock_logger.info.assert_called_once_with('validate: Got type %s',
type(flow_val))
@mock.patch('oauth2client.contrib._appengine_ndb._LOGGER')
def test_validate_none(self, mock_logger):
flow_prop = TestNDBModel.flow
flow_val = None
flow_prop._validate(flow_val)
mock_logger.info.assert_called_once_with('validate: Got type %s',
type(flow_val))
@mock.patch('oauth2client.contrib._appengine_ndb._LOGGER')
def test_validate_bad_type(self, mock_logger):
flow_prop = TestNDBModel.flow
flow_val = object()
with self.assertRaises(TypeError):
flow_prop._validate(flow_val)
mock_logger.info.assert_called_once_with('validate: Got type %s',
type(flow_val))
class TestCredentialsNDBProperty(unittest2.TestCase):
def setUp(self):
self.testbed = testbed.Testbed()
self.testbed.activate()
self.testbed.init_datastore_v3_stub()
self.testbed.init_memcache_stub()
def tearDown(self):
self.testbed.deactivate()
def test_valid_creds_get_put(self):
creds = client.Credentials()
instance = TestNDBModel(creds=creds, id='bar')
instance.put()
retrieved = TestNDBModel.get_by_id('bar')
self.assertIsInstance(retrieved.creds, client.Credentials)
@mock.patch('oauth2client.contrib._appengine_ndb._LOGGER')
def test_validate_success(self, mock_logger):
creds_prop = TestNDBModel.creds
creds_val = client.Credentials()
creds_prop._validate(creds_val)
mock_logger.info.assert_called_once_with('validate: Got type %s',
type(creds_val))
@mock.patch('oauth2client.contrib._appengine_ndb._LOGGER')
def test_validate_none(self, mock_logger):
creds_prop = TestNDBModel.creds
creds_val = None
creds_prop._validate(creds_val)
mock_logger.info.assert_called_once_with('validate: Got type %s',
type(creds_val))
@mock.patch('oauth2client.contrib._appengine_ndb._LOGGER')
def test_validate_bad_type(self, mock_logger):
creds_prop = TestNDBModel.creds
creds_val = object()
with self.assertRaises(TypeError):
creds_prop._validate(creds_val)
mock_logger.info.assert_called_once_with('validate: Got type %s',
type(creds_val))
def test__to_base_type_valid_creds(self):
creds_prop = TestNDBModel.creds
creds = client.Credentials()
creds_json = json.loads(creds_prop._to_base_type(creds))
self.assertDictEqual(creds_json, {
'_class': 'Credentials',
'_module': 'oauth2client.client',
'token_expiry': None,
})
def test__to_base_type_null_creds(self):
creds_prop = TestNDBModel.creds
self.assertEqual(creds_prop._to_base_type(None), '')
def test__from_base_type_valid_creds(self):
creds_prop = TestNDBModel.creds
creds_json = json.dumps({
'_class': 'Credentials',
'_module': 'oauth2client.client',
'token_expiry': None,
})
creds = creds_prop._from_base_type(creds_json)
self.assertIsInstance(creds, client.Credentials)
def test__from_base_type_false_value(self):
creds_prop = TestNDBModel.creds
self.assertIsNone(creds_prop._from_base_type(''))
self.assertIsNone(creds_prop._from_base_type(False))
self.assertIsNone(creds_prop._from_base_type(None))
self.assertIsNone(creds_prop._from_base_type([]))
self.assertIsNone(creds_prop._from_base_type({}))
def test__from_base_type_bad_json(self):
creds_prop = TestNDBModel.creds
creds_json = '{JK-I-AM-NOT-JSON'
self.assertIsNone(creds_prop._from_base_type(creds_json))