rm settee
[disclosr.git] / couchdb / SetteeDatabaseTest.php
blob:a/couchdb/settee/tests/SetteeDatabaseTest.php -> blob:b/couchdb/settee/tests/SetteeDatabaseTest.php
  <?php
   
  require_once (realpath(dirname(__FILE__) . '/../src/settee.php'));
  require_once (dirname(__FILE__) . '/SetteeTestCase.class.php');
   
  class SetteeDatabaseTest extends SetteeTestCase {
   
  private $db;
   
  public function setUp() {
  parent::setUp();
  $dbname = "settee_tests_" . md5(microtime(true));
  $this->db = $this->server->get_db($dbname);
  $this->server->create_db($this->db);
  }
   
  public function test_document_lifecycle_objectbased() {
  $doc = new StdClass();
  $doc->firstName = "Irakli";
  $doc->lastName = "Nadareishvili";
  $doc->IQ = 200;
  $doc->hobbies = array("skiing", "swimming");
  $doc->pets = array ("whitey" => "labrador", "mikey" => "pug");
   
  $doc = $this->db->save($doc);
  $this->assertTrue(!empty($doc->_id) && !empty($doc->_rev), "Document creation success [object-based]");
   
  $_rev = $doc->_rev;
  $doc = $this->db->get($doc->_id);
  $this->assertEquals($_rev, $doc->_rev, "Document retrieval success [object-based] test");
   
  $doc->firstName = "Ika";
  $db_doc = $this->db->save($doc);
  $this->assertEquals($doc->firstName, $db_doc->firstName, "Document update success [object-based]");
   
  $this->db->delete($doc);
   
   
  try {
  $doc = $this->db->get($doc->_id);
  } catch (SetteeRestClientException $e) {
  // we expect exception to fire, so this is good.
  return;
  }
   
  $this->fail('Document still available for retrieval after being deleted. [object-based]');
  }
   
  // Should work with json string as well:
  //
   
   
  public function test_document_lifecycle_jsonbased() {
  $doc = '{"firstName":"Irakli","lastName":"Nadareishvili","IQ":200,"hobbies":["skiing","swimming"],"pets":{"whitey":"labrador","mikey":"pug"}}';
   
  $doc = $this->db->save($doc);
  $this->assertTrue(!empty($doc->_id) && !empty($doc->_rev), "Document creation success [json-based]");
   
  $_rev = $doc->_rev;
   
  $db_doc = $this->db->get($doc->_id);
  $this->assertEquals($_rev, $db_doc->_rev, "Document retrieval success [json-based] test");
   
  $doc = '{';
  $doc .= '"_id":"' . $db_doc->_id . '",';
  $doc .= '"_rev":"' . $db_doc->_rev . '",';
  $doc .= '"firstName":"Ika","lastName":"Nadareishvili","IQ":200,"hobbies":["skiing","swimming"],"pets":{"whitey":"labrador","mikey":"pug"}}';
   
  $orig_doc = json_decode($doc);
  $db_doc = $this->db->save($doc);
  $this->assertEquals($orig_doc->firstName, $db_doc->firstName, "Document update success [json-based]");
   
  $doc = '{';
  $doc .= '"_id":"' . $db_doc->_id . '",';
  $doc .= '"_rev":"' . $db_doc->_rev . '",';
  $doc .= '"firstName":"Ika","lastName":"Nadareishvili","IQ":200,"hobbies":["skiing","swimming"],"pets":{"whitey":"labrador","mikey":"pug"}}';
   
  $this->db->delete($doc);
   
  try {
  $doc = $this->db->get($db_doc->_id);
  } catch (SetteeRestClientException $e) {
  // we expect exception to fire, so this is good.
  return;
  }
   
  $this->fail('Document still available for retrieval after being deleted. [object-based]');
  }
   
  public function test_invalid_document() {
  $doc = 12345;
  try {
  $doc = $this->db->save($doc);
  } catch (SetteeRestClientException $e) {
  // we expect exception to fire, so this is good.
  return;
  }
   
  $this->fail('Document saved with invalid format');
  }
   
  public function test_get_rev() {
  $doc = new stdClass();
  $doc->_id = "some_fixed_id";
  $doc = $this->db->save($doc);
   
  $_rev = $doc->_rev;
   
  $db_rev = $this->db->get_rev($doc->_id);
  $this->assertEquals($_rev, $db_rev, "Document Revision retrieval success");
   
  // _rev is now attached to this object due to last ->save() call
  $doc->_id = "some_fixed_id";
  $doc->title = "Some Fixed ID";
  $doc = $this->db->save($doc);
   
  $_rev = $doc->_rev;
   
  $db_rev = $this->db->get_rev($doc->_id);
  $this->assertEquals($_rev, $db_rev, "Document Revision retrieval success after re-save");
   
  }
   
  public function test_save_auto_revision_detection() {
  $doc = new stdClass();
  $doc->_id = "some_fixed_id";
  $this->db->save($doc);
   
  $doc = new stdClass();
  $doc->_id = "some_fixed_id";
  $doc->extra_field = "some other value";
   
  $new_doc = $this->db->save($doc, true);
  $this->assertEquals ($new_doc->extra_field, "some other value", "Testing auto-rev detection by save method");
  }
   
  public function test_inline_attachment_json() {
  $doc = '{
  "_id":"attachment_doc",
  "_attachments":
  {
  "foo.txt":
  {
  "content_type":"text\/plain",
  "data": "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
  }
  }
  }';
  $db_doc = $this->db->save($doc);
  $this->assertTrue(is_object($db_doc->_attachments), "Inline attachment save successful [json-based]");
  }
   
  public function test_inline_attachment_obj_content() {
  $doc = new stdClass();
  $doc->_id = "attachment_doc";
  $this->db->add_attachment($doc, "foo.txt", "This is some text to be encoded", "text/plain");
  $db_doc = $this->db->save($doc);
  $this->assertTrue(is_object($db_doc->_attachments), "Inline attachment save successful [object-based]");
   
  $doc = new stdClass();
  $doc->_id = "attachment_doc_autodetect";
  $this->db->add_attachment($doc, "foo.txt", "This is some other text to be encoded");
  $db_doc = $this->db->save($doc);
  $this->assertTrue(is_object($db_doc->_attachments), "Inline attachment save successful [object-based, mime auto-detection]");
  }
   
  public function test_inline_attachment_obj_file() {
  $doc = new stdClass();
  $doc->_id = "attachment_doc";
  $file_path = dirname(__FILE__) . "/resources/couch-logo.pdf";
  $this->db->add_attachment_file($doc, "foo.pdf", $file_path, "application/pdf");
  $db_doc = $this->db->save($doc);
  $this->assertTrue(is_object($db_doc->_attachments), "Inline attachment of file successful");
   
  $doc = new stdClass();
  $doc->_id = "attachment_doc_autodetect";
  $file_path = dirname(__FILE__) . "/resources/couch-logo.pdf";
  $this->db->add_attachment_file($doc, "foo.pdf", $file_path);
  $db_doc = $this->db->save($doc);
  $this->assertTrue(is_object($db_doc->_attachments), "Inline attachment of file successful w/ mime type auto-detection");
  }
   
  public function test_view_lifecycle() {
  $this->_create_some_sample_docs();
   
  $map_src = <<<VIEW
  function(doc) {
  if(doc.date && doc.title) {
  emit(doc.date, doc.title);
  }
  }
  VIEW;
   
  $view = $this->db->save_view("foo_views", "bar_view", $map_src);
  $this->assertEquals("_design/foo_views", $view->_id, "View Creation Success");
   
  $view = $this->db->get_view("foo_views", "bar_view");
  $this->assertEquals(3, $view->total_rows, "Running a View Success");
   
  $map_src = <<<VIEW
  function(doc) {
  if(doc.date) {
  emit(doc.date, doc);
  }
  }
  VIEW;
   
  $view = $this->db->save_view("foo_views", "bar_view", $map_src);
  $this->assertEquals("_design/foo_views", $view->_id, "View Update Success");
   
  $view = $this->db->get_view("foo_views", "bar_view");
  $this->assertEquals("Well hello and welcome to my new blog...", $view->rows[0]->value->body, "Running a View Success (after update)");
   
  $view = $this->db->get_view("foo_views", "bar_view", "2009/02/17 21:13:39");
  $this->assertEquals("Bought a Cat", $view->rows[0]->value->title, "Running a Parametrized View");
   
  $view = $this->db->get_view("foo_views", "bar_view", array("2009/01/30 18:04:11", "2009/02/17 21:13:39"));
  $this->assertEquals("Biking", $view->rows[0]->value->title, "Running a Parametrized View with range");
   
  $view = $this->db->get_view("foo_views", "bar_view", array("2009/02/17 21:13:39", "2009/01/30 18:04:11"), true);
  $this->assertEquals("Bought a Cat", $view->rows[0]->value->title, "Running a Parametrized View with range, descending");
  $this->assertEquals(2, count($view->rows), "Running a Parametrized View with range, descending [count]");
   
  }
   
  function test_two_views_in_a_design_doc() {
   
  $map_src = <<<VIEW
  function(doc) {
  if(doc.date && doc.title) {
  emit(doc.date, doc.title);
  }
  }
  VIEW;
   
  $view = $this->db->save_view("a_settee_design_doc", "foo_view", $map_src);
  $this->assertTrue(isset($view->views->foo_view), "View1 Creation Success");
   
  $view = $this->db->save_view("a_settee_design_doc", "bar_view", $map_src);
  $this->assertTrue(isset($view->views->bar_view), "View2 Creation Success");
  }
   
  /**
  * Create some sample docs for running tests on them.
  *
  * <p>This sample was taken from a wonderful book:
  * CouchDB: The Definitive Guide (Animal Guide) by J. Chris Anderson, Jan Lehnardt and Noah Slater
  * http://www.amazon.com/CouchDB-Definitive-Guide-Relax-Animal/dp/0596155891/ref=sr_1_1?ie=UTF8&qid=1311533443&sr=8-1
  *
  * @return void
  */
  private function _create_some_sample_docs() {
  $doc = new stdClass();
  $doc->_id = "biking";
  $doc->title = "Biking";
  $doc->body = "My biggest hobby is mountainbiking";
  $doc->date = "2009/01/30 18:04:11";
  $this->db->save($doc);
   
  $doc = new stdClass();
  $doc->_id = "bought-a-cat";
  $doc->title = "Bought a Cat";
  $doc->body = "I went to the the pet store earlier and brought home a little kitty...";
  $doc->date = "2009/02/17 21:13:39";
  $this->db->save($doc);
   
  $doc = new stdClass();
  $doc->_id = "hello-world";
  $doc->title = "Hello World";
  $doc->body = "Well hello and welcome to my new blog...";
  $doc->date = "2009/01/15 15:52:20";
  $this->db->save($doc);
  }
   
  public function tearDown() {
  $ret = $this->server->drop_db($this->db);
  }
   
  }