<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -39,6 +39,9 @@ def echo(msg):
 
 def save(query):
     return request('/test/save' + query['key'], method='POST', data=query)
+
+def save_many(query, comment=''):
+    return request('/test/save_many', method='POST', data=urllib.urlencode({'query': simplejson.dumps(query), 'comment': comment}))
         
 class DatabaseTest(unittest.TestCase):
     pass
@@ -56,6 +59,7 @@ class InfobaseTestCase(unittest.TestCase):
         global b
         b = browser()
         try:
+            # create new database with name &quot;test&quot;
             self.assertEquals2(request(&quot;/test&quot;, method=&quot;PUT&quot;), {&quot;ok&quot;: True})
         except Exception:
             self.tearDown()
@@ -66,6 +70,7 @@ class InfobaseTestCase(unittest.TestCase):
 
     def tearDown(self):
         self.clear_threadlocal()
+        # delete test database
         request('/test', method=&quot;DELETE&quot;)
 
     def assertEquals2(self, a, b):
@@ -171,5 +176,102 @@ class DocumentTest(InfobaseTestCase):
         d = get('/zero')
         self.assertEquals(b.status, 404)
 
+# create author, book and collection types to test validations
+types = [{
+    &quot;key&quot;: &quot;/type/author&quot;,
+    &quot;type&quot;: &quot;/type/type&quot;,
+    &quot;kind&quot;: &quot;regular&quot;,
+    &quot;properties&quot;: [{
+        &quot;name&quot;: &quot;name&quot;,
+        &quot;expected_type&quot;: {&quot;key&quot;: &quot;/type/string&quot;},
+        &quot;unique&quot;: True
+    }, {
+        &quot;name&quot;: &quot;bio&quot;,
+        &quot;expected_type&quot;: {&quot;key&quot;: &quot;/type/text&quot;},
+        &quot;unique&quot;: True
+    }]
+}, {
+    &quot;key&quot;: &quot;/type/book&quot;,
+    &quot;type&quot;: &quot;/type/type&quot;,
+    &quot;kind&quot;: &quot;regular&quot;,
+    &quot;properties&quot;: [{
+        &quot;name&quot;: &quot;title&quot;,
+        &quot;expected_type&quot;: {&quot;key&quot;: &quot;/type/string&quot;},
+        &quot;unique&quot;: True
+    }, {
+        &quot;name&quot;: &quot;authors&quot;,
+        &quot;expected_type&quot;: {&quot;key&quot;: &quot;/type/author&quot;},
+        &quot;unique&quot;: False
+    }, {
+        &quot;name&quot;: &quot;publisher&quot;,
+        &quot;expected_type&quot;: {&quot;key&quot;: &quot;/type/string&quot;},
+        &quot;unique&quot;: True
+    }, {
+        &quot;name&quot;: &quot;description&quot;,
+        &quot;expected_type&quot;: {&quot;key&quot;: &quot;/type/text&quot;},
+        &quot;unique&quot;: True
+    }]
+}, {
+    &quot;key&quot;: &quot;/type/collection&quot;,
+    &quot;type&quot;: &quot;/type/type&quot;,
+    &quot;kind&quot;: &quot;regular&quot;,
+    &quot;properties&quot;: [{
+        &quot;name&quot;: &quot;name&quot;,
+        &quot;expected_type&quot;: {&quot;key&quot;: &quot;/type/string&quot;},
+        &quot;unique&quot;: True
+    }, {
+        &quot;name&quot;: &quot;books&quot;,
+        &quot;expected_type&quot;: {&quot;key&quot;: &quot;/type/book&quot;},
+        &quot;unique&quot;: False
+    }]
+}]
+
+class MoreDocumentTest(DocumentTest):
+    def setUp(self):
+        DocumentTest.setUp(self)
+        save_many(types)
+
+    def test_save_validation(self):
+        # ok: name is string
+        d = save({'key': '/author/x', 'type': '/type/author', 'name': 'x'})
+        self.assertEquals(b.status, 200)
+        self.assertEquals(d, {&quot;key&quot;: &quot;/author/x&quot;, &quot;revision&quot;: 1})
+        
+        # error: name is int instead of string
+        d = save({'key': '/author/x', 'type': '/type/author', 'name': 42})
+        self.assertEquals(b.status, 400)
+
+        # error: name is list instead of single value
+        d = save({'key': '/author/x', 'type': '/type/author', 'name': ['x', 'y']})
+        self.assertEquals(b.status, 400)
+
+    def test_validation_when_type_changes(self):
+        # create an author and a book
+        save({'key': '/author/x', 'type': '/type/author', 'name': 'x'})
+        save({'key': '/book/x', 'type': '/type/book', 'title': 'x', 'authors': [{'key': '/author/x'}], 'publisher': 'publisher_x'})
+
+        # change schema of &quot;/type/book&quot; and make expected_type of &quot;publisher&quot; as &quot;/type/publisher&quot;
+        save({
+            &quot;key&quot;: &quot;/type/publisher&quot;,
+            &quot;type&quot;: &quot;/type/type&quot;,
+            &quot;kind&quot;: &quot;regular&quot;,
+            &quot;properties&quot;: [{
+                &quot;name&quot;: &quot;name&quot;,
+                &quot;expected_type&quot;: &quot;/type/string&quot;,
+                &quot;unique&quot;: True
+             }]
+        })
+
+        d = get('/type/book')
+        assert d['properties'][2]['name'] == &quot;publisher&quot;
+        d['properties'][2]['expected_type'] = {&quot;key&quot;: &quot;/type/publisher&quot;}
+        save(d)
+
+        # now changing just the title of the book should not fail.
+        d = get('/book/x')
+        d['title'] = 'xx'
+        save(d)
+        self.assertEquals(b.status, 200)
+
 if __name__ == &quot;__main__&quot;:
     unittest.main()</diff>
      <filename>test/test_infobase.py</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>8b0cf8194d5b7c7921b28832dceaec485dae3121</id>
    </parent>
  </parents>
  <author>
    <name>Anand Chitipothu</name>
    <email>anandology@gmail.com</email>
  </author>
  <url>http://github.com/infogami/infogami/commit/1b79b59c82ef23bfda5da219adeeaa1bffc089e2</url>
  <id>1b79b59c82ef23bfda5da219adeeaa1bffc089e2</id>
  <committed-date>2009-05-11T09:23:32-07:00</committed-date>
  <authored-date>2009-05-11T09:23:32-07:00</authored-date>
  <message>test save validations</message>
  <tree>9efb0a0aef9d892a49c12ca98fafedfb7a72aca9</tree>
  <committer>
    <name>Anand Chitipothu</name>
    <email>anandology@gmail.com</email>
  </committer>
</commit>
