Home | History | Annotate | Download | only in django_util
      1 # Copyright 2016 Google Inc. All Rights Reserved.
      2 #
      3 # Licensed under the Apache License, Version 2.0 (the "License");
      4 # you may not use this file except in compliance with the License.
      5 # You may obtain a copy of the License at
      6 #
      7 #     http://www.apache.org/licenses/LICENSE-2.0
      8 #
      9 # Unless required by applicable law or agreed to in writing, software
     10 # distributed under the License is distributed on an "AS IS" BASIS,
     11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 # See the License for the specific language governing permissions and
     13 # limitations under the License.
     14 
     15 """Tests for the DjangoORM storage class."""
     16 
     17 # Mock a Django environment
     18 import datetime
     19 
     20 from django.db import models
     21 import mock
     22 import unittest2
     23 
     24 from oauth2client import GOOGLE_TOKEN_URI
     25 from oauth2client.client import OAuth2Credentials
     26 from oauth2client.contrib.django_util.models import CredentialsField
     27 from oauth2client.contrib.django_util.storage import (
     28     DjangoORMStorage as Storage)
     29 
     30 
     31 class TestStorage(unittest2.TestCase):
     32     def setUp(self):
     33         access_token = 'foo'
     34         client_id = 'some_client_id'
     35         client_secret = 'cOuDdkfjxxnv+'
     36         refresh_token = '1/0/a.df219fjls0'
     37         token_expiry = datetime.datetime.utcnow()
     38         user_agent = 'refresh_checker/1.0'
     39 
     40         self.credentials = OAuth2Credentials(
     41             access_token, client_id, client_secret,
     42             refresh_token, token_expiry, GOOGLE_TOKEN_URI,
     43             user_agent)
     44 
     45         self.key_name = 'id'
     46         self.key_value = '1'
     47         self.property_name = 'credentials'
     48 
     49     def test_constructor(self):
     50         storage = Storage(FakeCredentialsModel, self.key_name,
     51                           self.key_value, self.property_name)
     52 
     53         self.assertEqual(storage.model_class, FakeCredentialsModel)
     54         self.assertEqual(storage.key_name, self.key_name)
     55         self.assertEqual(storage.key_value, self.key_value)
     56         self.assertEqual(storage.property_name, self.property_name)
     57 
     58     @mock.patch('django.db.models')
     59     def test_locked_get(self, djangoModel):
     60         fake_model_with_credentials = FakeCredentialsModelMock()
     61         entities = [
     62             fake_model_with_credentials
     63         ]
     64         filter_mock = mock.Mock(return_value=entities)
     65         object_mock = mock.Mock()
     66         object_mock.filter = filter_mock
     67         FakeCredentialsModelMock.objects = object_mock
     68 
     69         storage = Storage(FakeCredentialsModelMock, self.key_name,
     70                           self.key_value, self.property_name)
     71         credential = storage.locked_get()
     72         self.assertEqual(
     73             credential, fake_model_with_credentials.credentials)
     74 
     75     @mock.patch('django.db.models')
     76     def test_locked_get_no_entities(self, djangoModel):
     77         entities = []
     78         filter_mock = mock.Mock(return_value=entities)
     79         object_mock = mock.Mock()
     80         object_mock.filter = filter_mock
     81         FakeCredentialsModelMock.objects = object_mock
     82 
     83         storage = Storage(FakeCredentialsModelMock, self.key_name,
     84                           self.key_value, self.property_name)
     85         credential = storage.locked_get()
     86         self.assertIsNone(credential)
     87 
     88     @mock.patch('django.db.models')
     89     def test_locked_get_no_set_store(self, djangoModel):
     90         fake_model_with_credentials = FakeCredentialsModelMockNoSet()
     91         entities = [
     92             fake_model_with_credentials
     93         ]
     94         filter_mock = mock.Mock(return_value=entities)
     95         object_mock = mock.Mock()
     96         object_mock.filter = filter_mock
     97         FakeCredentialsModelMockNoSet.objects = object_mock
     98 
     99         storage = Storage(FakeCredentialsModelMockNoSet, self.key_name,
    100                           self.key_value, self.property_name)
    101         credential = storage.locked_get()
    102         self.assertEqual(
    103             credential, fake_model_with_credentials.credentials)
    104 
    105     @mock.patch('django.db.models')
    106     def test_locked_put(self, djangoModel):
    107         entity_mock = mock.Mock(credentials=None)
    108         objects = mock.Mock(
    109             get_or_create=mock.Mock(return_value=(entity_mock, None)))
    110         FakeCredentialsModelMock.objects = objects
    111         storage = Storage(FakeCredentialsModelMock, self.key_name,
    112                           self.key_value, self.property_name)
    113         storage.locked_put(self.credentials)
    114 
    115     @mock.patch('django.db.models')
    116     def test_locked_delete(self, djangoModel):
    117         class FakeEntities(object):
    118             def __init__(self):
    119                 self.deleted = False
    120 
    121             def delete(self):
    122                 self.deleted = True
    123 
    124         fake_entities = FakeEntities()
    125         entities = fake_entities
    126 
    127         filter_mock = mock.Mock(return_value=entities)
    128         object_mock = mock.Mock()
    129         object_mock.filter = filter_mock
    130         FakeCredentialsModelMock.objects = object_mock
    131         storage = Storage(FakeCredentialsModelMock, self.key_name,
    132                           self.key_value, self.property_name)
    133         storage.locked_delete()
    134         self.assertTrue(fake_entities.deleted)
    135 
    136 
    137 class CredentialWithSetStore(CredentialsField):
    138     def __init__(self):
    139         self.model = CredentialWithSetStore
    140 
    141     def set_store(self, storage):
    142         pass
    143 
    144 
    145 class FakeCredentialsModel(models.Model):
    146     credentials = CredentialsField()
    147 
    148 
    149 class FakeCredentialsModelMock(object):
    150     def __init__(self, *args, **kwargs):
    151         self.model = FakeCredentialsModelMock
    152         self.saved = False
    153         self.deleted = False
    154 
    155     credentials = CredentialWithSetStore()
    156 
    157 
    158 class FakeCredentialsModelMockNoSet(object):
    159     def __init__(self, set_store=False, *args, **kwargs):
    160         self.model = FakeCredentialsModelMock
    161         self.saved = False
    162         self.deleted = False
    163 
    164     credentials = CredentialsField()
    165