--- a/Allura/allura/tests/model/test_filesystem.py
+++ b/Allura/allura/tests/model/test_filesystem.py
@@ -1,33 +1,131 @@
# -*- coding: utf-8 -*-
-"""
-Model tests for auth
-"""
-import mock
-from pylons import c, g
-from ming.orm.ormsession import ThreadLocalORMSession
+import os
+from unittest import TestCase
+from cStringIO import StringIO
+
+from pylons import response
+from ming.orm import MappedClass, session
+
from allura import model as M
-from allura.lib.app_globals import Globals
+from allura.tests import helpers
-def setUp():
- g._push_object(Globals())
- c._push_object(mock.Mock())
- ThreadLocalORMSession.close_all()
- g.set_project('test')
- g.set_app('hello')
- M.File.remove({})
- c.user = M.User.query.get(username='test-admin')
+class File(M.File):
+ class __mongometa__:
+ session = M.session.main_orm_session
+MappedClass.compile_all()
-def test_file():
- f = M.File.save('test.txt', 'text/plain', '')
- f = M.File.save('test.txt', 'text/plain', 'This is some text')
- assert f.filename != 'test.txt'
- f1 = M.File.by_metadata(filename='test.txt').one()
- assert f1 is f
- with M.File.create('text/plain', filename='test1.txt') as fp:
- print >> fp, 'This is another file'
- assert len(M.File.list()) == 2
- with f1.open() as fp:
- assert fp.read() == 'This is some text'
- f1.delete()
- assert len(M.File.list()) == 1
+class TestFile(TestCase):
+
+ def setUp(self):
+ helpers.setup_unit_test()
+ self.session = session(File)
+ self.conn = M.session.main_doc_session.db._connection
+ self.conn.drop_all()
+ self.db = M.session.main_doc_session.db
+
+ def test_from_stream(self):
+ f = File.from_stream('test1.txt', StringIO('test1'))
+ self.session.flush()
+ assert self.db.fs.count() == 1
+ assert self.db.fs.files.count() == 1
+ assert self.db.fs.chunks.count() == 1
+ assert f.filename == 'test1.txt'
+ assert f.content_type == 'text/plain'
+ self._assert_content(f, 'test1')
+
+ def test_from_data(self):
+ f = File.from_data('test2.txt', 'test2')
+ self.session.flush(f)
+ assert self.db.fs.count() == 1
+ assert self.db.fs.files.count() == 1
+ assert self.db.fs.chunks.count() == 1
+ assert f.filename == 'test2.txt'
+ assert f.content_type == 'text/plain'
+ self._assert_content(f, 'test2')
+
+ def test_from_path(self):
+ path = __file__.rstrip('c')
+ f = File.from_path(path)
+ self.session.flush()
+ assert self.db.fs.count() == 1
+ assert self.db.fs.files.count() == 1
+ assert self.db.fs.chunks.count() >= 1
+ assert f.filename == os.path.basename(path)
+ text = f.rfile().read()
+ assert text.startswith('# -*-')
+
+ def test_delete(self):
+ f = File.from_data('test1.txt', 'test1')
+ self.session.flush()
+ assert self.db.fs.count() == 1
+ assert self.db.fs.files.count() == 1
+ assert self.db.fs.chunks.count() == 1
+ f.delete()
+ self.session.flush()
+ assert self.db.fs.count() == 0
+ assert self.db.fs.files.count() == 0
+ assert self.db.fs.chunks.count() == 0
+
+ def test_remove(self):
+ File.from_data('test1.txt', 'test1')
+ File.from_data('test2.txt', 'test2')
+ self.session.flush()
+ assert self.db.fs.count() == 2
+ assert self.db.fs.files.count() == 2
+ assert self.db.fs.chunks.count() == 2
+ File.remove(dict(filename='test1.txt'))
+ self.session.flush()
+ assert self.db.fs.count() == 1
+ assert self.db.fs.files.count() == 1
+ assert self.db.fs.chunks.count() == 1
+
+ def test_overwrite(self):
+ f = File.from_data('test1.txt', 'test1')
+ self.session.flush()
+ assert self.db.fs.count() == 1
+ assert self.db.fs.files.count() == 1
+ assert self.db.fs.chunks.count() == 1
+ self._assert_content(f, 'test1')
+ with f.wfile() as fp:
+ fp.write('test2')
+ self.session.flush()
+ assert self.db.fs.count() == 1
+ assert self.db.fs.files.count() == 2
+ assert self.db.fs.chunks.count() == 2
+ self._assert_content(f, 'test2')
+
+ def test_serve(self):
+ f = File.from_data('test1.txt', 'test1')
+ self.session.flush()
+ assert [ 'test1' ] == list(f.serve())
+ assert response.content_type == f.content_type
+ assert 'Content-Disposition' not in response.headers
+ assert [ 'test1' ] == list(f.serve(False))
+ assert response.content_type == f.content_type
+ assert response.headers['Content-Disposition'] == \
+ 'attachment;filename=test1.txt'
+
+ def test_image(self):
+ path = os.path.join(
+ os.path.dirname(__file__), '..', 'data', 'user.png')
+ with open(path) as fp:
+ f, t = File.save_image(
+ 'user.png',
+ fp,
+ thumbnail_size=(16,16),
+ square=True,
+ save_original=True)
+ self.session.flush()
+ assert f.content_type == 'image/png'
+ assert f.is_image()
+ assert t.content_type == 'image/png'
+ assert t.is_image()
+ assert f.filename == t.filename
+ assert self.db.fs.count() == 2
+ assert self.db.fs.files.count() == 2
+ assert self.db.fs.chunks.count() == 2
+
+ def _assert_content(self, f, content):
+ result = f.rfile().read()
+ assert result == content, result