1{ pkgs, ... }: 2let 3 homeserverUrl = "http://homeserver:8008"; 4 5 private_key = pkgs.runCommand "matrix_key.pem" { 6 buildInputs = [ pkgs.dendrite ]; 7 } "generate-keys --private-key $out"; 8in 9{ 10 name = "dendrite"; 11 meta = with pkgs.lib; { 12 maintainers = teams.matrix.members; 13 }; 14 15 nodes = { 16 homeserver = 17 { pkgs, ... }: 18 { 19 services.dendrite = { 20 enable = true; 21 loadCredential = [ "test_private_key:${private_key}" ]; 22 openRegistration = true; 23 settings = { 24 global.server_name = "test-dendrite-server.com"; 25 global.private_key = "$CREDENTIALS_DIRECTORY/test_private_key"; 26 client_api.registration_disabled = false; 27 }; 28 }; 29 30 networking.firewall.allowedTCPPorts = [ 8008 ]; 31 }; 32 33 client = 34 { pkgs, ... }: 35 { 36 environment.systemPackages = [ 37 (pkgs.writers.writePython3Bin "do_test" { libraries = [ pkgs.python3Packages.matrix-nio ]; } '' 38 import asyncio 39 40 from nio import AsyncClient 41 42 43 async def main() -> None: 44 # Connect to dendrite 45 client = AsyncClient("http://homeserver:8008", "alice") 46 47 # Register as user alice 48 response = await client.register("alice", "my-secret-password") 49 50 # Log in as user alice 51 response = await client.login("my-secret-password") 52 53 # Create a new room 54 response = await client.room_create(federate=False) 55 room_id = response.room_id 56 57 # Join the room 58 response = await client.join(room_id) 59 60 # Send a message to the room 61 response = await client.room_send( 62 room_id=room_id, 63 message_type="m.room.message", 64 content={ 65 "msgtype": "m.text", 66 "body": "Hello world!" 67 } 68 ) 69 70 # Sync responses 71 response = await client.sync(timeout=30000) 72 73 # Check the message was received by dendrite 74 last_message = response.rooms.join[room_id].timeline.events[-1].body 75 assert last_message == "Hello world!" 76 77 # Leave the room 78 response = await client.room_leave(room_id) 79 80 # Close the client 81 await client.close() 82 83 asyncio.get_event_loop().run_until_complete(main()) 84 '') 85 ]; 86 }; 87 }; 88 89 testScript = '' 90 start_all() 91 92 with subtest("start the homeserver"): 93 homeserver.wait_for_unit("dendrite.service") 94 homeserver.wait_for_open_port(8008) 95 96 with subtest("ensure messages can be exchanged"): 97 client.succeed("do_test") 98 ''; 99 100}