Mercurial > libervia-backend
annotate tests/e2e/libervia-cli/test_libervia-cli.py @ 3582:71516731d0aa
core (memory/sqla): database migration using Alembic:
Alembic database migration tool, which is the recommended one for SQLAlchemy has been
integrated. When a database is created, it will be used to stamp to current (head)
revision, otherwise, DB will be checked to see if it needs to be updated, and upgrade will
be triggered if necessary.
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 25 Jun 2021 17:55:23 +0200 |
parents | d78b5eae912a |
children | 9e491b2bab88 |
rev | line source |
---|---|
3415 | 1 #!/usr/bin/env python3 |
2 | |
3480
7550ae9cfbac
Renamed the project from "Salut à Toi" to "Libervia":
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
3 # Libervia: an XMPP client |
3479 | 4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
3415 | 5 |
6 # This program is free software: you can redistribute it and/or modify | |
7 # it under the terms of the GNU Affero General Public License as published by | |
8 # the Free Software Foundation, either version 3 of the License, or | |
9 # (at your option) any later version. | |
10 | |
11 # This program is distributed in the hope that it will be useful, | |
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 # GNU Affero General Public License for more details. | |
15 | |
16 # You should have received a copy of the GNU Affero General Public License | |
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
18 | |
19 import os | |
20 import shutil | |
21 import pytest | |
22 import sh | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
23 from sh import li |
3415 | 24 from sat.tools.common import uri |
25 | |
26 | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
27 if os.getenv("LIBERVIA_TEST_ENV_E2E") is None: |
3415 | 28 pytest.skip( |
29 "skipping end-to-end tests, we are not in a test environment", | |
30 allow_module_level=True | |
31 ) | |
32 | |
33 | |
34 pytestmark = pytest.mark.usefixtures("test_profiles") | |
35 | |
36 | |
37 class TestInstall: | |
38 | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
39 def test_li_can_run(self): |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
40 li("--version") |
3415 | 41 |
42 | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
43 class TestLiberviaCliAccount: |
3415 | 44 |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
45 def test_create_and_delete(self, li_json): |
3415 | 46 """Create an account in-band, connect it, then delete it and its profile""" |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
47 li.account.create( |
3415 | 48 "test_create@server1.test", |
49 "test", | |
50 profile="test_create", | |
51 host="server1.test" | |
52 ) | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
53 profiles = li_json.profile.list() |
3415 | 54 assert "test_create" in profiles |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
55 li.profile.connect(connect=True, profile="test_create") |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
56 li.account.delete(profile="test_create", force=True) |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
57 li.profile.delete("test_create", force=True) |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
58 profiles = li_json.profile.list() |
3415 | 59 assert "test_create" not in profiles |
60 | |
61 | |
62 @pytest.mark.usefixtures("pubsub_nodes") | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
63 class TestLiberviaCliPubsub: |
3415 | 64 |
65 def test_node_create_info_delete(self): | |
66 node_name = "tmp_node" | |
67 with pytest.raises(sh.ErrorReturnCode_16): | |
68 # the node should not exist | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
69 li.pubsub.node.info(node=node_name) |
3415 | 70 try: |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
71 li.pubsub.node.create(node=node_name) |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
72 # if node exist as expected, following command won't raise an exception |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
73 metadata = li.pubsub.node.info(node=node_name) |
3415 | 74 assert len(metadata.strip()) |
75 finally: | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
76 li.pubsub.node.delete(node=node_name, force=True) |
3415 | 77 |
78 with pytest.raises(sh.ErrorReturnCode_16): | |
79 # the node should not exist anymore | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
80 li.pubsub.node.info(node=node_name) |
3415 | 81 |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
82 def test_set_get_delete_purge(self, li_elt): |
3415 | 83 content = "test item" |
84 payload = f"<test>{content}</test>" | |
85 | |
86 # we create 3 items and check them | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
87 item1_id = li.pubsub.set(node="test", quiet=True, _in=payload) |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
88 item2_id = li.pubsub.set(node="test", quiet=True, _in=payload) |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
89 item3_id = li.pubsub.set(node="test", quiet=True, _in=payload) |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
90 parsed_elt = li_elt.pubsub.get(node="test", item=item1_id) |
3415 | 91 payload = parsed_elt.firstChildElement() |
92 assert payload.name == 'test' | |
93 assert str(payload) == content | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
94 parsed_elt = li_elt.pubsub.get(node="test", item=item2_id) |
3415 | 95 payload = parsed_elt.firstChildElement() |
96 assert payload.name == 'test' | |
97 assert str(payload) == content | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
98 parsed_elt = li_elt.pubsub.get(node="test", item=item3_id) |
3415 | 99 payload = parsed_elt.firstChildElement() |
100 assert payload.name == 'test' | |
101 assert str(payload) == content | |
102 | |
103 # deleting first item should work | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
104 li.pubsub.delete(node="test", item=item1_id, force=True) |
3415 | 105 with pytest.raises(sh.ErrorReturnCode_16): |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
106 li.pubsub.get(node="test", item=item1_id) |
3415 | 107 |
108 # there must be a least item2 and item3 in the node | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
109 node_items = li_elt.pubsub.get(node="test") |
3415 | 110 assert len(list(node_items.elements())) >= 2 |
111 | |
112 # after purge, node must be empty | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
113 li.pubsub.node.purge(node="test", force=True) |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
114 node_items = li_elt.pubsub.get(node="test") |
3415 | 115 assert len(list(node_items.elements())) == 0 |
116 | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
117 def test_edit(self, editor, li_elt): |
3415 | 118 content = "original item" |
119 payload = f"<test>{content}</test>" | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
120 item_id = li.pubsub.set(node="test", quiet=True, _in=payload) |
3415 | 121 editor.set_filter('content.replace("original", "edited")') |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
122 li.pubsub.edit(node="test", item=item_id, _env=editor.env) |
3415 | 123 assert "original item" in editor.original_content |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
124 parsed_elt = li_elt.pubsub.get(node="test", item=item_id) |
3415 | 125 edited_payload = parsed_elt.firstChildElement() |
126 expected_edited_content = content.replace("original", "edited") | |
127 assert edited_payload.name == 'test' | |
128 assert str(edited_payload) == expected_edited_content | |
129 | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
130 def test_affiliations(self, li_json): |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
131 affiliations = li_json.pubsub.affiliations() |
3415 | 132 assert affiliations["test"] == "owner" |
133 | |
134 def test_uri(self): | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
135 built_uri = li.pubsub.uri( |
3415 | 136 service="pubsub.example.net", node="some_node" |
137 ).strip() | |
138 assert built_uri == "xmpp:pubsub.example.net?;node=some_node" | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
139 built_uri = li.pubsub.uri( |
3415 | 140 service="pubsub.example.net", node="some_node", item="some_item" |
141 ).strip() | |
142 assert built_uri == "xmpp:pubsub.example.net?;node=some_node;item=some_item" | |
143 | |
144 | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
145 class TestLiberviaCliBlog: |
3415 | 146 MICROBLOG_NS = "urn:xmpp:microblog:0" |
147 | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
148 def test_set_get(self, li_json): |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
149 li.blog.set(_in="markdown **bold** [link](https://example.net)") |
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
150 item_data = li_json.blog.get(max=1) |
3415 | 151 item = item_data[0][0] |
152 metadata = item_data[1] | |
153 assert metadata['service'] == "account1@server1.test" | |
154 assert metadata['node'] == self.MICROBLOG_NS | |
155 assert metadata['rsm'].keys() <= {"first", "last", "index", "count"} | |
156 item_id = item['id'] | |
157 expected_uri = uri.buildXMPPUri( | |
158 'pubsub', subtype="microblog", path="account1@server1.test", | |
159 node=self.MICROBLOG_NS, item=item_id | |
160 ) | |
161 assert item['uri'] == expected_uri | |
162 assert item['content_xhtml'] == ( | |
163 '<div><p>markdown <strong>bold</strong> ' | |
164 '<a href="https://example.net">link</a></p></div>' | |
165 ) | |
166 assert isinstance(item['published'], int) | |
167 assert isinstance(item['updated'], int) | |
168 assert isinstance(item['comments'], list) | |
169 assert isinstance(item['tags'], list) | |
170 assert item['author'] == 'account1' | |
171 assert item['author_jid'] == 'account1@server1.test' | |
172 | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
173 def test_edit(self, editor, li_json): |
3415 | 174 payload_md = "content in **markdown**" |
175 editor.set_filter(repr(payload_md)) | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
176 li.blog.edit(_env=editor.env) |
3415 | 177 assert len(editor.original_content) == 0 |
178 assert editor.new_content == payload_md | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
179 items_data = li_json.blog.get(max=1) |
3415 | 180 last_item = items_data[0][0] |
181 last_item_id = last_item['id'] | |
182 assert last_item['content'] == "content in markdown" | |
183 assert last_item['content_xhtml'] == ( | |
184 "<div><p>content in <strong>markdown</strong></p></div>" | |
185 ) | |
186 editor.set_filter('f"{content} extended"') | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
187 li.blog.edit("--last-item", _env=editor.env) |
3415 | 188 assert editor.original_content == payload_md |
189 assert editor.new_content == f"{payload_md} extended" | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
190 items_data = li_json.blog.get(max=1) |
3415 | 191 last_item = items_data[0][0] |
192 # we check that the id hasn't been modified | |
193 assert last_item['id'] == last_item_id | |
194 assert last_item['content'] == "content in markdown extended" | |
195 assert last_item['content_xhtml'] == ( | |
196 "<div><p>content in <strong>markdown</strong> extended</p></div>" | |
197 ) | |
198 | |
199 | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
200 class TestLiberviaCliFile: |
3415 | 201 |
202 def test_upload_get(self, fake_file): | |
203 source_file = fake_file.size(10240) | |
204 source_file_hash = fake_file.get_source_hash(source_file) | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
205 upload_url = li.file.upload(source_file).strip() |
3415 | 206 |
207 dest_file = fake_file.new_dest_file() | |
208 try: | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
209 li.file.get(upload_url, dest_file=dest_file) |
3415 | 210 dest_file_hash = fake_file.get_dest_hash(dest_file) |
211 finally: | |
212 dest_file.unlink() | |
213 | |
214 assert source_file_hash == dest_file_hash | |
215 | |
216 def test_send_receive(self, fake_file): | |
217 source_file = fake_file.size(10240) | |
218 source_file_hash = fake_file.get_source_hash(source_file) | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
219 send_cmd = li.file.send(source_file, "account1@server2.test", _bg=True) |
3415 | 220 dest_path = fake_file.dest_files / "test_send_receive" |
221 dest_path.mkdir() | |
222 try: | |
3498
d78b5eae912a
tests: update following names change
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
223 li.file.receive( |
3415 | 224 "account1@server1.test", profile="account1_s2", path=dest_path) |
225 dest_file = dest_path / source_file.name | |
226 dest_file_hash = fake_file.get_dest_hash(dest_file) | |
227 finally: | |
228 shutil.rmtree(dest_path) | |
229 send_cmd.wait() | |
230 | |
231 assert source_file_hash == dest_file_hash |