deltachat-rpc-client 2.35.0__tar.gz → 2.37.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. {deltachat_rpc_client-2.35.0/src/deltachat_rpc_client.egg-info → deltachat_rpc_client-2.37.0}/PKG-INFO +1 -1
  2. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/pyproject.toml +1 -1
  3. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0/src/deltachat_rpc_client.egg-info}/PKG-INFO +1 -1
  4. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_calls.py +45 -0
  5. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_securejoin.py +1 -1
  6. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_something.py +99 -0
  7. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/LICENSE +0 -0
  8. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/README.md +0 -0
  9. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/setup.cfg +0 -0
  10. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/__init__.py +0 -0
  11. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/_utils.py +0 -0
  12. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/account.py +0 -0
  13. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/chat.py +0 -0
  14. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/client.py +0 -0
  15. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/const.py +0 -0
  16. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/contact.py +0 -0
  17. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/deltachat.py +0 -0
  18. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/events.py +0 -0
  19. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/message.py +0 -0
  20. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/py.typed +0 -0
  21. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/pytestplugin.py +0 -0
  22. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client/rpc.py +0 -0
  23. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client.egg-info/SOURCES.txt +0 -0
  24. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client.egg-info/dependency_links.txt +0 -0
  25. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client.egg-info/entry_points.txt +0 -0
  26. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/src/deltachat_rpc_client.egg-info/top_level.txt +0 -0
  27. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_account_events.py +0 -0
  28. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_chatlist_events.py +0 -0
  29. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_cross_core.py +0 -0
  30. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_folders.py +0 -0
  31. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_iroh_webxdc.py +0 -0
  32. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_key_transfer.py +0 -0
  33. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_multidevice.py +0 -0
  34. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_multitransport.py +0 -0
  35. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_vcard.py +0 -0
  36. {deltachat_rpc_client-2.35.0 → deltachat_rpc_client-2.37.0}/tests/test_webxdc.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deltachat-rpc-client
3
- Version: 2.35.0
3
+ Version: 2.37.0
4
4
  Summary: Python client for Delta Chat core JSON-RPC interface
5
5
  License-Expression: MPL-2.0
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "deltachat-rpc-client"
7
- version = "2.35.0"
7
+ version = "2.37.0"
8
8
  license = "MPL-2.0"
9
9
  description = "Python client for Delta Chat core JSON-RPC interface"
10
10
  classifiers = [
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deltachat-rpc-client
3
- Version: 2.35.0
3
+ Version: 2.37.0
4
4
  Summary: Python client for Delta Chat core JSON-RPC interface
5
5
  License-Expression: MPL-2.0
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -107,3 +107,48 @@ def test_no_contact_request_call(acfactory) -> None:
107
107
  msg = bob.get_message_by_id(event.msg_id)
108
108
  if msg.get_snapshot().text == "Hello!":
109
109
  break
110
+
111
+
112
+ def test_who_can_call_me_nobody(acfactory) -> None:
113
+ alice, bob = acfactory.get_online_accounts(2)
114
+
115
+ # Bob sets "who can call me" to "nobody" (2)
116
+ bob.set_config("who_can_call_me", "2")
117
+
118
+ # Bob even accepts Alice in advance so the chat does not appear as contact request.
119
+ bob.create_chat(alice)
120
+
121
+ alice_chat_bob = alice.create_chat(bob)
122
+ alice_chat_bob.place_outgoing_call("offer")
123
+ alice_chat_bob.send_text("Hello!")
124
+
125
+ # Notification for "Hello!" message should arrive
126
+ # without the call ringing.
127
+ while True:
128
+ event = bob.wait_for_event()
129
+
130
+ # There should be no incoming call notification.
131
+ assert event.kind != EventType.INCOMING_CALL
132
+
133
+ if event.kind == EventType.INCOMING_MSG:
134
+ msg = bob.get_message_by_id(event.msg_id)
135
+ if msg.get_snapshot().text == "Hello!":
136
+ break
137
+
138
+
139
+ def test_who_can_call_me_everybody(acfactory) -> None:
140
+ """Test that if "who can call me" setting is set to "everybody", calls arrive even in contact request chats."""
141
+ alice, bob = acfactory.get_online_accounts(2)
142
+
143
+ # Bob sets "who can call me" to "nobody" (0)
144
+ bob.set_config("who_can_call_me", "0")
145
+
146
+ alice_chat_bob = alice.create_chat(bob)
147
+ alice_chat_bob.place_outgoing_call("offer")
148
+ incoming_call_event = bob.wait_for_event(EventType.INCOMING_CALL)
149
+
150
+ incoming_call_message = Message(bob, incoming_call_event.msg_id)
151
+
152
+ # Even with the call arriving, the chat is still in the contact request mode.
153
+ incoming_chat = incoming_call_message.get_snapshot().chat
154
+ assert incoming_chat.get_basic_snapshot().is_contact_request
@@ -696,6 +696,6 @@ def test_withdraw_securejoin_qr(acfactory):
696
696
  event = alice.wait_for_event()
697
697
  if (
698
698
  event.kind == EventType.WARNING
699
- and "Ignoring vg-request-with-auth message because of invalid auth code." in event.msg
699
+ and "Ignoring RequestWithAuth message because of invalid auth code." in event.msg
700
700
  ):
701
701
  break
@@ -340,9 +340,11 @@ def test_receive_imf_failure(acfactory) -> None:
340
340
  msg_id = event.msg_id
341
341
  message = bob.get_message_by_id(msg_id)
342
342
  snapshot = message.get_snapshot()
343
+ version = bob.get_info()["deltachat_core_version"]
343
344
  assert (
344
345
  snapshot.text == "❌ Failed to receive a message:"
345
346
  " Condition failed: `!context.get_config_bool(Config::FailOnReceivingFullMsg).await?`."
347
+ f" Core version {version}."
346
348
  " Please report this bug to delta@merlinux.eu or https://support.delta.chat/."
347
349
  )
348
350
 
@@ -505,6 +507,103 @@ def test_import_export_backup(acfactory, tmp_path) -> None:
505
507
  assert alice2.manager.get_system_info()
506
508
 
507
509
 
510
+ def test_import_export_online_all(acfactory, tmp_path, data, log) -> None:
511
+ (ac1, some1) = acfactory.get_online_accounts(2)
512
+
513
+ log.section("create some chat content")
514
+ some1_addr = some1.get_config("addr")
515
+ chat1 = ac1.create_contact(some1).create_chat()
516
+ chat1.send_text("msg1")
517
+ assert len(ac1.get_contacts()) == 1
518
+
519
+ original_image_path = data.get_path("image/avatar64x64.png")
520
+ chat1.send_file(str(original_image_path))
521
+
522
+ # Add another 100KB file that ensures that the progress is smooth enough
523
+ path = tmp_path / "attachment.txt"
524
+ with path.open("w") as file:
525
+ file.truncate(100000)
526
+ chat1.send_file(str(path))
527
+
528
+ def assert_account_is_proper(ac):
529
+ contacts = ac.get_contacts()
530
+ assert len(contacts) == 1
531
+ contact2 = contacts[0]
532
+ assert contact2.get_snapshot().address == some1_addr
533
+ chat2 = contact2.create_chat()
534
+ messages = chat2.get_messages()
535
+ assert len(messages) == 3 + E2EE_INFO_MSGS
536
+ assert messages[0 + E2EE_INFO_MSGS].get_snapshot().text == "msg1"
537
+ snapshot = messages[1 + E2EE_INFO_MSGS].get_snapshot()
538
+ assert snapshot.file_mime == "image/png"
539
+ assert os.stat(snapshot.file).st_size == os.stat(original_image_path).st_size
540
+ ac.set_config("displayname", "new displayname")
541
+ assert ac.get_config("displayname") == "new displayname"
542
+
543
+ assert_account_is_proper(ac1)
544
+
545
+ backupdir = tmp_path / "backup"
546
+ backupdir.mkdir()
547
+
548
+ log.section(f"export all to {backupdir}")
549
+ ac1.stop_io()
550
+ ac1.export_backup(backupdir)
551
+ progress = 0
552
+ files_written = []
553
+ while True:
554
+ event = ac1.wait_for_event()
555
+ if event.kind == EventType.IMEX_PROGRESS:
556
+ assert event.progress > 0 # Progress 0 indicates error.
557
+ assert event.progress < progress + 250
558
+ progress = event.progress
559
+ if progress == 1000:
560
+ break
561
+ elif event.kind == EventType.IMEX_FILE_WRITTEN:
562
+ files_written.append(event.path)
563
+ else:
564
+ logging.info(event)
565
+ assert len(files_written) == 1
566
+ assert os.path.exists(files_written[0])
567
+ ac1.start_io()
568
+
569
+ log.section("get fresh empty account")
570
+ ac2 = acfactory.get_unconfigured_account()
571
+
572
+ log.section("import backup and check it's proper")
573
+ ac2.import_backup(files_written[0])
574
+ progress = 0
575
+ while True:
576
+ event = ac2.wait_for_event()
577
+ if event.kind == EventType.IMEX_PROGRESS:
578
+ assert event.progress > 0 # Progress 0 indicates error.
579
+ assert event.progress < progress + 250
580
+ progress = event.progress
581
+ if progress == 1000:
582
+ break
583
+ else:
584
+ logging.info(event)
585
+ assert_account_is_proper(ac1)
586
+ assert_account_is_proper(ac2)
587
+
588
+ log.section(f"Second-time export all to {backupdir}")
589
+ ac1.stop_io()
590
+ ac1.export_backup(backupdir)
591
+ while True:
592
+ event = ac1.wait_for_event()
593
+ if event.kind == EventType.IMEX_PROGRESS:
594
+ assert event.progress > 0
595
+ if event.progress == 1000:
596
+ break
597
+ elif event.kind == EventType.IMEX_FILE_WRITTEN:
598
+ files_written.append(event.path)
599
+ else:
600
+ logging.info(event)
601
+ assert len(files_written) == 2
602
+ assert os.path.exists(files_written[1])
603
+ assert files_written[1] != files_written[0]
604
+ assert len(list(backupdir.glob("*.tar"))) == 2
605
+
606
+
508
607
  def test_import_export_keys(acfactory, tmp_path) -> None:
509
608
  alice, bob = acfactory.get_online_accounts(2)
510
609