class TestMongoResource(object):
    def setup(self):
        self.query = {'_id': 5}
        self.config = configs.MongoConfig()
        self.resource = MongoResource(resource_name=None,
                                      config=self.config,
                                      proxies=None,
                                      collection='things')


    def test_create(self):
        doc = {'test': 'doc'}
        inserted_id = 'mongo_id'
        expected = { '_id': inserted_id }
        with mock.patch.object(type(self.resource), 'client'):
            with mock.patch.object(type(self.resource), 'collection'):
                self.resource.collection.insert.return_value = inserted_id
                result = self.resource.create(query=None, attributes=doc)
                self.resource.collection.insert.assert_called_once_with(doc, safe=True)
                assert_equals(expected, result)

    def test_read(self):
        doc = [{'_id': 5, 'test': 'doc' }]
        cursor = mock.MagicMock()
        cursor.__iter__.return_value = iter(doc)
        cursor.count.return_value = 1
        with mock.patch.object(type(self.resource), 'client'):
            with mock.patch.object(type(self.resource), 'collection'):
                self.resource.collection.find.return_value = cursor
                result = self.resource.read(query=self.query)
                self.resource.collection.find.assert_called_once_with(self.query, fields=None)
                assert_equals(doc, result)
    
    def test_update(self):
        doc = {'test': 'doc' }
        with mock.patch.object(type(self.resource), 'client'):
            with mock.patch.object(type(self.resource), 'collection'):
                result = self.resource.update(query=self.query, attributes=doc)
                self.resource.collection.update.assert_called_once_with(
                    self.query, doc, safe=True
                )
        
    def test_delete(self):
        with mock.patch.object(type(self.resource), 'client'):
            with mock.patch.object(type(self.resource), 'collection'):
                result = self.resource.delete(query=self.query)
                self.resource.collection.remove.assert_called_once_with(
                    self.query, safe=True
                )
    
    def test_exists(self):
        count = mock.MagicMock()
        count.return_value = 1
        with mock.patch.object(type(self.resource), 'client'):
            with mock.patch.object(type(self.resource), 'collection'):
                self.resource.collection.find.return_value = count
                result = self.resource.exists(self.query)
                self.resource.collection.find.assert_called_once_with(self.query)
 def setup(self):
     self.query = {'_id': 5}
     self.config = configs.MongoConfig()
     self.resource = MongoResource(resource_name=None,
                                   config=self.config,
                                   proxies=None,
                                   collection='things')