test_invites.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. from mock import Mock
  2. from sydent.http.httpclient import FederationHttpClient
  3. from sydent.db.invite_tokens import JoinTokenStore
  4. from tests.utils import make_sydent
  5. from twisted.web.client import Response
  6. from twisted.trial import unittest
  7. class ThreepidInvitesTestCase(unittest.TestCase):
  8. """Tests features related to storing and delivering 3PID invites."""
  9. def setUp(self):
  10. # Create a new sydent
  11. self.sydent = make_sydent()
  12. def test_delete_on_bind(self):
  13. """Tests that 3PID invite tokens are deleted upon delivery after a successful
  14. bind.
  15. """
  16. self.sydent.run()
  17. # The 3PID we're working with.
  18. medium = "email"
  19. address = "john@example.com"
  20. # Mock post_json_get_nothing so the /onBind call doesn't fail.
  21. def post_json_get_nothing(uri, post_json, opts):
  22. return Response((b'HTTP', 1, 1), 200, b'OK', None, None)
  23. FederationHttpClient.post_json_get_nothing = Mock(
  24. side_effect=post_json_get_nothing,
  25. )
  26. # Manually insert an invite token, we'll check later that it's been deleted.
  27. join_token_store = JoinTokenStore(self.sydent)
  28. join_token_store.storeToken(
  29. medium, address, "!someroom:example.com", "@jane:example.com",
  30. "sometoken",
  31. )
  32. # Make sure the token still exists and can be retrieved.
  33. tokens = join_token_store.getTokens(medium, address)
  34. self.assertEqual(len(tokens), 1, tokens)
  35. # Bind the 3PID
  36. self.sydent.threepidBinder.addBinding(
  37. medium, address, "@john:example.com",
  38. )
  39. # Give Sydent some time to call /onBind and delete the token.
  40. self.sydent.reactor.advance(1000)
  41. cur = self.sydent.db.cursor()
  42. # Manually retrieve the tokens for this 3PID. We don't use getTokens because it
  43. # filters out sent tokens, so would return nothing even if the token hasn't been
  44. # deleted.
  45. res = cur.execute(
  46. "SELECT medium, address, room_id, sender, token FROM invite_tokens"
  47. " WHERE medium = ? AND address = ?",
  48. (medium, address,)
  49. )
  50. rows = res.fetchall()
  51. # Check that we didn't get any result.
  52. self.assertEqual(len(rows), 0, rows)
  53. class ThreepidInvitesNoDeleteTestCase(unittest.TestCase):
  54. """Test that invite tokens are not deleted when that is disabled.
  55. """
  56. def setUp(self):
  57. # Create a new sydent
  58. config = {
  59. "general": {
  60. "delete_tokens_on_bind": "false"
  61. }
  62. }
  63. self.sydent = make_sydent(test_config=config)
  64. def test_no_delete_on_bind(self):
  65. self.sydent.run()
  66. # The 3PID we're working with.
  67. medium = "email"
  68. address = "john@example.com"
  69. # Mock post_json_get_nothing so the /onBind call doesn't fail.
  70. def post_json_get_nothing(uri, post_json, opts):
  71. return Response((b'HTTP', 1, 1), 200, b'OK', None, None)
  72. FederationHttpClient.post_json_get_nothing = Mock(
  73. side_effect=post_json_get_nothing,
  74. )
  75. # Manually insert an invite token, we'll check later that it's been deleted.
  76. join_token_store = JoinTokenStore(self.sydent)
  77. join_token_store.storeToken(
  78. medium, address, "!someroom:example.com", "@jane:example.com",
  79. "sometoken",
  80. )
  81. # Make sure the token still exists and can be retrieved.
  82. tokens = join_token_store.getTokens(medium, address)
  83. self.assertEqual(len(tokens), 1, tokens)
  84. # Bind the 3PID
  85. self.sydent.threepidBinder.addBinding(
  86. medium, address, "@john:example.com",
  87. )
  88. # Give Sydent some time to call /onBind and delete the token.
  89. self.sydent.reactor.advance(1000)
  90. cur = self.sydent.db.cursor()
  91. # Manually retrieve the tokens for this 3PID. We don't use getTokens because it
  92. # filters out sent tokens, so would return nothing even if the token hasn't been
  93. # deleted.
  94. res = cur.execute(
  95. "SELECT medium, address, room_id, sender, token FROM invite_tokens"
  96. " WHERE medium = ? AND address = ?",
  97. (medium, address,)
  98. )
  99. rows = res.fetchall()
  100. # Check that we didn't get any result.
  101. self.assertEqual(len(rows), 1, rows)