1#!/usr/bin/env python 2# -*- coding:utf-8 -*- 3# 4# Copyright 2014 Google Inc. All Rights Reserved. 5# 6# Licensed under the Apache License, Version 2.0 (the "License"); 7# you may not use this file except in compliance with the License. 8# You may obtain a copy of the License at 9# 10# http://www.apache.org/licenses/LICENSE-2.0 11# 12# Unless required by applicable law or agreed to in writing, software 13# distributed under the License is distributed on an "AS IS" BASIS, 14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15# See the License for the specific language governing permissions and 16# limitations under the License. 17 18"""Model tests 19 20Unit tests for model utility methods. 21""" 22from __future__ import absolute_import 23 24__author__ = "[email protected] (Joe Gregorio)" 25 26import unittest 27 28from googleapiclient.model import BaseModel 29from googleapiclient.model import makepatch 30 31 32TEST_CASES = [ 33 # (message, original, modified, expected) 34 ("Remove an item from an object", {"a": 1, "b": 2}, {"a": 1}, {"b": None}), 35 ("Add an item to an object", {"a": 1}, {"a": 1, "b": 2}, {"b": 2}), 36 ("No changes", {"a": 1, "b": 2}, {"a": 1, "b": 2}, {}), 37 ("Empty objects", {}, {}, {}), 38 ("Modify an item in an object", {"a": 1, "b": 2}, {"a": 1, "b": 3}, {"b": 3}), 39 ("Change an array", {"a": 1, "b": [2, 3]}, {"a": 1, "b": [2]}, {"b": [2]}), 40 ( 41 "Modify a nested item", 42 {"a": 1, "b": {"foo": "bar", "baz": "qux"}}, 43 {"a": 1, "b": {"foo": "bar", "baz": "qaax"}}, 44 {"b": {"baz": "qaax"}}, 45 ), 46 ( 47 "Modify a nested array", 48 {"a": 1, "b": [{"foo": "bar", "baz": "qux"}]}, 49 {"a": 1, "b": [{"foo": "bar", "baz": "qaax"}]}, 50 {"b": [{"foo": "bar", "baz": "qaax"}]}, 51 ), 52 ( 53 "Remove item from a nested array", 54 {"a": 1, "b": [{"foo": "bar", "baz": "qux"}]}, 55 {"a": 1, "b": [{"foo": "bar"}]}, 56 {"b": [{"foo": "bar"}]}, 57 ), 58 ( 59 "Remove a nested item", 60 {"a": 1, "b": {"foo": "bar", "baz": "qux"}}, 61 {"a": 1, "b": {"foo": "bar"}}, 62 {"b": {"baz": None}}, 63 ), 64] 65 66 67class TestPatch(unittest.TestCase): 68 def test_patch(self): 69 for (msg, orig, mod, expected_patch) in TEST_CASES: 70 self.assertEqual(expected_patch, makepatch(orig, mod), msg=msg) 71 72 73class TestBaseModel(unittest.TestCase): 74 def test_build_query(self): 75 model = BaseModel() 76 77 test_cases = [ 78 ("hello", "world", "?hello=world"), 79 ("hello", u"world", "?hello=world"), 80 ("hello", "세계", "?hello=%EC%84%B8%EA%B3%84"), 81 ("hello", u"세계", "?hello=%EC%84%B8%EA%B3%84"), 82 ("hello", "こんにちは", "?hello=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF"), 83 ("hello", u"こんにちは", "?hello=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF"), 84 ("hello", "你好", "?hello=%E4%BD%A0%E5%A5%BD"), 85 ("hello", u"你好", "?hello=%E4%BD%A0%E5%A5%BD"), 86 ("hello", "مرحبا", "?hello=%D9%85%D8%B1%D8%AD%D8%A8%D8%A7"), 87 ("hello", u"مرحبا", "?hello=%D9%85%D8%B1%D8%AD%D8%A8%D8%A7"), 88 ] 89 90 for case in test_cases: 91 key, value, expect = case 92 self.assertEqual(expect, model._build_query({key: value})) 93 94 95if __name__ == "__main__": 96 unittest.main() 97