def test_create_thread_and_post(community1, client, app, db, req_ctx): community = community1 user = community.test_user # activate email reply app.config["SBE_FORUM_REPLY_BY_MAIL"] = True app.config["MAIL_ADDRESS_TAG_CHAR"] = "+" # create a new user, add him/her to the current community as a MANAGER community.set_membership(user, MANAGER) db.session.commit() client_login(client, user) mail = app.extensions["mail"] with mail.record_messages() as outbox: title = "Brand new thread" content = "shiny thread message" url = url_for("forum.new_thread", community_id=community.slug) data = {"title": title, "message": content} data["__action"] = "create" data["send_by_email"] = "y" response = client.post(url, data=data) assert response.status_code == 302 # extract the thread_id from the redirection url in response threadid = response.location.rsplit("/", 2)[1] # retrieve the new thread, make sur it has the message url = url_for("forum.thread", thread_id=threadid, community_id=community.slug, title=title) response = client.get(url) assert response.status_code == 200 assert content in response.get_data(as_text=True) # check the email was sent with the new thread assert len(outbox) == 1 assert outbox[0].subject == "[My Community] Brand new thread" # reset the outbox for checking threadpost email with mail.record_messages() as outbox: content = data["message"] = "my cherished post" del data["title"] response = client.post(url, data=data) assert response.status_code == 302 # retrieve the new thread, make sur it has the message url = url_for("forum.thread", thread_id=threadid, community_id=community.slug, title=title) response = client.get(url) assert response.status_code == 200 assert content in response.get_data(as_text=True) # check the email was sent with the new threadpost assert len(outbox) == 1 expected = "[My Community] Brand new thread" assert text_type(outbox[0].subject) == expected
def test_create_thread_and_post(community1, client, app, db, req_ctx): community = community1 user = community.test_user # activate email reply app.config["SBE_FORUM_REPLY_BY_MAIL"] = True # create a new user, add him/her to the current community as a MANAGER community.set_membership(user, MANAGER) db.session.commit() client_login(client, user) mail = app.extensions["mail"] with mail.record_messages() as outbox: title = "Brand new thread" content = "shiny thread message" url = url_for("forum.new_thread", community_id=community.slug) data = {"title": title, "message": content} data["__action"] = "create" data["send_by_email"] = "y" response = client.post(url, data=data) assert response.status_code == 302 # extract the thread_id from the redirection url in response threadid = response.location.rsplit("/", 2)[1] # retrieve the new thread, make sur it has the message url = url_for( "forum.thread", thread_id=threadid, community_id=community.slug, title=title ) response = client.get(url) assert response.status_code == 200 assert content in response.get_data(as_text=True) # check the email was sent with the new thread assert len(outbox) == 1 assert outbox[0].subject == "[My Community] Brand new thread" # reset the outbox for checking threadpost email with mail.record_messages() as outbox: content = data["message"] = "my cherished post" del data["title"] response = client.post(url, data=data) assert response.status_code == 302 # retrieve the new thread, make sur it has the message url = url_for( "forum.thread", thread_id=threadid, community_id=community.slug, title=title ) response = client.get(url) assert response.status_code == 200 assert content in response.get_data(as_text=True) # check the email was sent with the new threadpost assert len(outbox) == 1 expected = "[My Community] Brand new thread" assert str(outbox[0].subject) == expected
def test_community_settings(app, client, community1, req_ctx): security_service = app.services["security"] # type: SecurityService security_service.start() url = url_for("communities.settings", community_id=community1.slug) user = community1.test_user with client_login(client, user): response = client.get(url) assert response.status_code == 403 app.services["security"].grant_role(user, Admin) response = client.get(url) assert response.status_code == 200 data = { "__action": "edit", "name": "edited community", "description": "my community", "linked_group": "", "type": "participative", } response = client.post(url, data=data, follow_redirects=True) assert response.status_code == 200 assert "edited community" in response.get_data(as_text=True)
def test_util_create(app, client, db, community, req_ctx): folder = community.folder user = community.test_user with client_login(client, user): g.community = CommunityPresenter(community) name = "document" fs = FileStorage(BytesIO(b"content"), filename=name, content_type="text/plain") doc = view_util.create_document(folder, fs) db.session.flush() assert doc.parent == folder assert doc.name == name # test upload with same name: should be renamed fs = FileStorage(BytesIO(b"content"), filename=name, content_type="text/plain") doc2 = view_util.create_document(folder, fs) db.session.flush() assert doc2.parent == folder assert len(folder.children) == 2 assert doc2.name == name + "-1" messages = get_flashed_messages() assert len(messages) == 1
def test_zip(community, client, req_ctx): user = community.test_user with client_login(client, user): title = "onepage.pdf" content_type = "application/pdf" data = { "file": (open_file(title), title, content_type), "action": "upload" } folder = community.folder url = url_for("documents.folder_post", community_id=community.slug, folder_id=folder.id) response = client.post(url, data=data) assert response.status_code == 302 doc = folder.children[0] data = { "action": "download", "object-selected": ["cmis:document:%d" % doc.id] } url = url_for("documents.folder_post", community_id=community.slug, folder_id=folder.id) response = client.post(url, data=data) assert response.status_code == 200 assert response.content_type == "application/zip" zipfile = ZipFile(BytesIO(response.data)) assert [zipfile.namelist()[0]] == [title]
def test_recursive_zip(community, client, req_ctx): user = community.test_user with client_login(client, user): data = {"action": "new", "title": "my folder"} folder = community.folder url = url_for( "documents.folder_post", community_id=community.slug, folder_id=folder.id ) response = client.post(url, data=data) assert response.status_code == 302 my_folder = folder.children[0] title = "onepage.pdf" content_type = "application/pdf" data = {"file": (open_file(title), title, content_type), "action": "upload"} url = url_for( "documents.folder_post", community_id=community.slug, folder_id=my_folder.id ) response = client.post(url, data=data) assert response.status_code == 302 data = { "action": "download", "object-selected": ["cmis:folder:%d" % my_folder.id], } url = url_for( "documents.folder_post", community_id=community.slug, folder_id=folder.id ) response = client.post(url, data=data) assert response.status_code == 200 assert response.content_type == "application/zip" zipfile = ZipFile(BytesIO(response.data)) assert zipfile.namelist() == ["my folder/" + title]
def test_index(community1, app, db, client, req_ctx): security_service = app.services["security"] # type: SecurityService security_service.start() user = community1.test_user with client_login(client, user): response = client.get(url_for("communities.index")) assert response.status_code == 200
def test_create_page_initial_form(client, community1, user1, req_ctx): with client: with client_login(client, user1): g.community = community1 view = views.PageCreate() view.prepare_args([], {}) form = view.form assert form["last_revision_id"].data is None
def test_new(community1, app, client, db, req_ctx): security_service = app.services["security"] # type: SecurityService # security_service.use_cache = False security_service.start() user = community1.test_user with client_login(client, user): response = client.get(url_for("communities.new")) assert response.status_code == 403 security_service.grant_role(user, Admin) db.session.flush() with client_login(client, user): response = client.get(url_for("communities.new")) assert response.status_code == 200
def test_home(client, community1, user1, req_ctx): with client_login(client, user1): response = client.get(url_for("wiki.index", community_id=community1.slug)) assert response.status_code == 302 response = client.get( url_for("wiki.page", title="Home", community_id=community1.slug) ) assert response.status_code == 200
def test_create_revision(user, client, req_ctx): with client: with client_login(client, user): page = WikiPage("abc") page.create_revision("def", "page updated") assert len(page.revisions) == 2 last_revision = page.revisions[1] assert last_revision.number == 1 assert last_revision.author == user
def test_home(app, client, db, community, req_ctx): folder = community.folder user = community.test_user with client_login(client, user): response = client.get(url_for("documents.index", community_id=community.slug)) assert response.status_code == 302 path = path_from_url(response.location) expected = f"/communities/{community.slug}/docs/folder/{folder.id}" assert path == expected
def test_community_home(community1, community2, app, client, req_ctx): security_service = app.services["security"] # type: SecurityService security_service.start() url = app.default_view.url_for(community1) user1 = community1.test_user with client_login(client, user1): response = client.get(url) assert response.status_code == 302 expected_url = url_for("wall.index", community_id=community1.slug, _external=True) assert response.location == expected_url user2 = community2.test_user with client_login(client, user2): response = client.get(url) assert response.status_code == 403
def test_binary_upload(client, community, req_ctx): name = "random.bin" user = community.test_user with client_login(client, user): _test_upload( community, client, name, "application/octet-stream", assert_preview_available=False, )
def test_community_home(community1, community2, app, client, req_ctx): security_service = app.services["security"] # type: SecurityService security_service.start() url = app.default_view.url_for(community1) user1 = community1.test_user with client_login(client, user1): response = client.get(url) assert response.status_code == 302 expected_url = url_for( "wall.index", community_id=community1.slug, _external=True ) assert response.location == expected_url user2 = community2.test_user with client_login(client, user2): response = client.get(url) assert response.status_code == 403
def test_home(app, client, db, community, req_ctx): folder = community.folder user = community.test_user with client_login(client, user): response = client.get( url_for("documents.index", community_id=community.slug)) assert response.status_code == 302 path = path_from_url(response.location) expected = "/communities/{}/docs/folder/{}".format( community.slug, folder.id) assert path == expected
def test_wiki_indexed( community1, community2, admin_user, user1, user2, user3, app, db, client, req_ctx ): SERVICES = ("security", "indexing") for svc in SERVICES: svc = app.services[svc] if not svc.running: svc.start() svc = app.services["indexing"] with client: with client_login(client, admin_user): page1 = WikiPage(title="Community 1", community=community1) db.session.add(page1) page2 = WikiPage(title="Community 2: other", community=community2) db.session.add(page2) db.session.commit() obj_types = (WikiPage.entity_type,) with client_login(client, user3): res = svc.search("community", object_types=obj_types) assert len(res) == 0 with client_login(client, user1): res = svc.search("community", object_types=obj_types) assert len(res) == 1 hit = res[0] assert hit["object_key"] == page1.object_key with client_login(client, user2): res = svc.search("community", object_types=obj_types) assert len(res) == 1 hit = res[0] assert hit["object_key"] == page2.object_key
def test_members(app, client, db, community1, community2, req_ctx): security_service = app.services["security"] # type: SecurityService security_service.start() user1 = community1.test_user user2 = community2.test_user with client_login(client, user1): url = url_for("communities.members", community_id=community1.slug) response = client.get(url) assert response.status_code == 200 # test add user data = {"action": "add-user-role", "user": user2.id} response = client.post(url, data=data) assert response.status_code == 403 security_service.grant_role(user1, Admin) data = {"action": "add-user-role", "user": user2.id, "role": "member"} response = client.post(url, data=data, follow_redirects=True) assert response.status_code == 200 membership = [m for m in community1.memberships if m.user == user2][0] assert membership.role == "member" data["action"] = "set-user-role" data["role"] = "manager" response = client.post(url, data=data, follow_redirects=True) assert response.status_code == 200 db.session.expire(membership) assert membership.role == "manager" # Community.query.session is not self.db.session, but web app # session. community = Community.query.get(community1.id) assert user2 in community.members # test delete data = { "action": "delete", "user": user2.id, "membership": [m.id for m in community1.memberships if m.user == user2][0], } response = client.post(url, data=data, follow_redirects=True) assert response.status_code == 200 assert user2 not in community.members
def test_new_page(user, client, req_ctx): with client: with client_login(client, user): print(current_user) page = WikiPage(title="Some page", body_src="abc") assert page.title == "Some page" assert page.name == "Some page" assert page.body_src == "abc" assert page.body_html == "<p>abc</p>" assert len(page.revisions) == 1 revision = page.revisions[0] assert revision.number == 0 assert revision.author == user
def test_zip_upload_uncompress(community, db, client, req_ctx): subfolder = Folder(title="folder 1", parent=community.folder) db.session.add(subfolder) db.session.flush() folder = community.folder files = [] files.append((BytesIO(b"A document"), "existing-doc", "text/plain")) files.append((open_file("content.zip"), "content.zip", "application/zip")) data = {"file": files, "action": "upload", "uncompress_files": True} url = url_for( "documents.folder_post", community_id=community.slug, folder_id=folder.id ) user = community.test_user with client_login(client, user): response = client.post(url, data=data) assert response.status_code == 302 expected = {"existing-doc", "folder 1", "existing-doc-1"} assert expected == {f.title for f in folder.children} expected = {"folder 1", "existing-doc-1"} assert expected == {f.title for f in folder.subfolders}
def test_create_thread_informative(app, db, client, community1, req_ctx): """Test with 'informative' community. No mail sent, unless user is MANAGER """ user = community1.test_user assert community1.type == "informative" community1.set_membership(user, MEMBER) db.session.commit() title = "Brand new thread" content = "shiny thread message" url = url_for("forum.new_thread", community_id=community1.slug) data = {"title": title, "message": content} data["__action"] = "create" mail = app.extensions["mail"] with client_login(client, user): with mail.record_messages() as outbox: data["send_by_email"] = "y" # actually should not be in html form response = client.post(url, data=data) assert response.status_code == 302 # FIXME: this doesn't pass # assert len(outbox) == 0 community1.set_membership(user, MANAGER) db.session.commit() with mail.record_messages() as outbox: data["send_by_email"] = "y" # should be in html form response = client.post(url, data=data) assert response.status_code == 302 assert len(outbox) == 1 with mail.record_messages() as outbox: del data["send_by_email"] response = client.post(url, data=data) assert response.status_code == 302 assert len(outbox) == 0
def test_zip_upload_uncompress(community, db, client, req_ctx): subfolder = Folder(title="folder 1", parent=community.folder) db.session.add(subfolder) db.session.flush() folder = community.folder files = [] files.append((BytesIO(b"A document"), "existing-doc", "text/plain")) files.append((open_file("content.zip"), "content.zip", "application/zip")) data = {"file": files, "action": "upload", "uncompress_files": True} url = url_for("documents.folder_post", community_id=community.slug, folder_id=folder.id) user = community.test_user with client_login(client, user): response = client.post(url, data=data) assert response.status_code == 302 expected = {"existing-doc", "folder 1", "existing-doc-1"} assert expected == {f.title for f in folder.children} expected = {"folder 1", "existing-doc-1"} assert expected == {f.title for f in folder.subfolders}
def test_create_thread_informative(app, db, client, community1, req_ctx): """Test with 'informative' community. No mail sent, unless user is MANAGER """ user = community1.test_user assert community1.type == "informative" community1.set_membership(user, MEMBER) db.session.commit() title = "Brand new thread" content = "shiny thread message" url = url_for("forum.new_thread", community_id=community1.slug) data = {"title": title, "message": content} data["__action"] = "create" mail = app.extensions["mail"] with client_login(client, user): with mail.record_messages() as outbox: data["send_by_email"] = "y" # actually should not be in html form response = client.post(url, data=data) assert response.status_code == 302 assert len(outbox) == 0 community1.set_membership(user, MANAGER) db.session.commit() with mail.record_messages() as outbox: data["send_by_email"] = "y" # should be in html form response = client.post(url, data=data) assert response.status_code == 302 assert len(outbox) == 1 with mail.record_messages() as outbox: del data["send_by_email"] response = client.post(url, data=data) assert response.status_code == 302 assert len(outbox) == 0
def test_image_upload(client, community, req_ctx): name = "picture.jpg" user = community.test_user with client_login(client, user): _test_upload(community, client, name, "image/jpeg")
def test_document_send_by_mail(app, community, client, req_ctx): mail = app.extensions["mail"] folder = community.folder user = community.test_user with client_login(client, user): # upload files for filename in ("ascii title.txt", "utf-8 est arrivé!.txt"): content_type = "text/plain" data = { "file": (BytesIO(b"file content"), filename, content_type), "action": "upload", } url = url_for( "documents.folder_post", community_id=community.slug, folder_id=folder.id, ) client.post(url, data=data) ascii_doc = folder.children[0] unicode_doc = folder.children[1] def get_send_url(doc_id): return url_for("documents.document_send", community_id=community.slug, doc_id=doc_id) # mail ascii filename with mail.record_messages() as outbox: url = get_send_url(ascii_doc.id) response = client.post( url, data={ "recipient": "*****@*****.**", "message": "Voilà un fichier" }, ) assert response.status_code == 302 assert len(outbox) == 1 msg = outbox[0] assert msg.subject == "[Abilian Test] Unknown sent you a file" assert msg.recipients == ["*****@*****.**"] assert len(msg.attachments) == 1 attachment = first(msg.attachments) assert isinstance(attachment, flask_mail.Attachment) assert attachment.filename == "ascii title.txt" # mail unicode filename with mail.record_messages() as outbox: url = get_send_url(unicode_doc.id) response = client.post( url, data={ "recipient": "*****@*****.**", "message": "Voilà un fichier" }, ) assert response.status_code == 302 assert len(outbox) == 1 msg = outbox[0] assert isinstance(msg, flask_mail.Message) assert msg.subject == "[Abilian Test] Unknown sent you a file" assert msg.recipients == ["*****@*****.**"] assert len(msg.attachments) == 1 attachment = first(msg.attachments) assert isinstance(attachment, flask_mail.Attachment) assert attachment.filename == "utf-8 est arrivé!.txt"
def test_create_page(community1, app, admin_user, client, req_ctx): community = community1 with client: with client_login(client, admin_user): url = url_for("wiki.page_new", community_id=community.slug) url += "?title=Some+page+name" response = client.get(url) assert response.status_code == 200 # make sure the title is filled when comming from wikilink assert 'value="Some page name"' in response.get_data(as_text=True) title = "Some page" body = "LuuP3jai" url = url_for("wiki.page_new", community_id=community.slug) data = {"title": title, "body_src": body, "__action": "create"} response = client.post(url, data=data) assert response.status_code == 302 url = url_for("wiki.page", community_id=community.slug, title=title) response = client.get(url) assert response.status_code == 200 assert body in response.get_data(as_text=True) # edit url = url_for("wiki.page_edit", community_id=community.slug, title=title) response = client.get(url) assert response.status_code == 200 # Slightly hackish way to get the page_id line = first( l for l in response.get_data(as_text=True).split("\n") if 'name="page_id"' in l ) m = re.search('value="(.*?)"', line) page_id = int(m.group(1)) url = url_for("wiki.page_changes", community_id=community.slug, title=title) response = client.get(url) assert response.status_code == 200 url = url_for("wiki.page_source", community_id=community.slug, title=title) response = client.get(url) assert response.status_code == 200 url = url_for("wiki.page_edit", community_id=community.slug) data = {"title": title, "page_id": page_id, "body_src": "abc def"} data["__action"] = "edit" response = client.post(url, data=data) assert response.status_code == 302 url = url_for( "wiki.page_compare", rev0="on", rev1="on", community_id=community.slug, title=title, ) response = client.get(url) assert response.status_code == 200
def test_pdf_upload(client, community, req_ctx): name = "onepage.pdf" user = community.test_user with client_login(client, user): _test_upload(community, client, name, "application/pdf")
def test_text_upload(client, community, req_ctx): name = "wikipedia-fr.txt" user = community.test_user with client_login(client, user): _test_upload(community, client, name, "text/plain", test_preview=False)
def test_document_send_by_mail(app, community, client, req_ctx): mail = app.extensions["mail"] folder = community.folder user = community.test_user with client_login(client, user): # upload files for filename in ("ascii title.txt", "utf-8 est arrivé!.txt"): content_type = "text/plain" data = { "file": (BytesIO(b"file content"), filename, content_type), "action": "upload", } url = url_for( "documents.folder_post", community_id=community.slug, folder_id=folder.id, ) client.post(url, data=data) ascii_doc = folder.children[0] unicode_doc = folder.children[1] def get_send_url(doc_id): return url_for( "documents.document_send", community_id=community.slug, doc_id=doc_id ) # mail ascii filename with mail.record_messages() as outbox: url = get_send_url(ascii_doc.id) response = client.post( url, data={"recipient": "*****@*****.**", "message": "Voilà un fichier"}, ) assert response.status_code == 302 assert len(outbox) == 1 msg = outbox[0] assert msg.subject == "[Abilian Test] Unknown sent you a file" assert msg.recipients == ["*****@*****.**"] assert len(msg.attachments) == 1 attachment = first(msg.attachments) assert isinstance(attachment, flask_mail.Attachment) assert attachment.filename == "ascii title.txt" # mail unicode filename with mail.record_messages() as outbox: url = get_send_url(unicode_doc.id) response = client.post( url, data={"recipient": "*****@*****.**", "message": "Voilà un fichier"}, ) assert response.status_code == 302 assert len(outbox) == 1 msg = outbox[0] assert isinstance(msg, flask_mail.Message) assert msg.subject == "[Abilian Test] Unknown sent you a file" assert msg.recipients == ["*****@*****.**"] assert len(msg.attachments) == 1 attachment = first(msg.attachments) assert isinstance(attachment, flask_mail.Attachment) assert attachment.filename == "utf-8 est arrivé!.txt"