defmodule MessageServer.StorageTest do use ExUnit.Case import ExUnit.CaptureLog @test_server_id "test_server" @test_storage_dir "storage/server_#{@test_server_id}" setup do # clean up any existing test storage File.rm_rf!(@test_storage_dir) # start the Storage GenServer for testing {:ok, pid} = MessageServer.Storage.start_link(@test_server_id) on_exit(fn -> # clean up after test if Process.alive?(pid), do: GenServer.stop(pid) File.rm_rf!(@test_storage_dir) end) %{storage_pid: pid} end test "creates storage directory on startup" do assert File.exists?(@test_storage_dir) assert File.dir?(@test_storage_dir) end test "appends message to user file" do user_id = "test_server-alice" from_user = "test_server-bob" message = "Hello Alice!" assert :ok = MessageServer.Storage.append_message(user_id, from_user, message) file_path = Path.join(@test_storage_dir, "#{user_id}.txt") assert File.exists?(file_path) content = File.read!(file_path) assert content == "#{from_user}: #{message}\n" end test "appends multiple messages to same user file" do user_id = "test_server-alice" assert :ok = MessageServer.Storage.append_message(user_id, "test_server-bob", "First message") assert :ok = MessageServer.Storage.append_message( user_id, "test_server-charlie", "Second message" ) file_path = Path.join(@test_storage_dir, "#{user_id}.txt") content = File.read!(file_path) expected_content = """ test_server-bob: First message test_server-charlie: Second message """ assert content == expected_content end test "creates separate files for different users" do assert :ok = MessageServer.Storage.append_message( "test_server-alice", "test_server-bob", "Hi Alice" ) assert :ok = MessageServer.Storage.append_message( "test_server-charlie", "test_server-bob", "Hi Charlie" ) alice_file = Path.join(@test_storage_dir, "test_server-alice.txt") charlie_file = Path.join(@test_storage_dir, "test_server-charlie.txt") assert File.exists?(alice_file) assert File.exists?(charlie_file) assert File.read!(alice_file) == "test_server-bob: Hi Alice\n" assert File.read!(charlie_file) == "test_server-bob: Hi Charlie\n" end test "handles messages with special characters" do user_id = "test_server-alice" from_user = "test_server-bob" message = "Hello! 🎉 Special chars: @#$%^&*()" assert :ok = MessageServer.Storage.append_message(user_id, from_user, message) file_path = Path.join(@test_storage_dir, "#{user_id}.txt") content = File.read!(file_path) assert content == "#{from_user}: #{message}\n" end test "logs successful message storage" do user_id = "test_server-alice" from_user = "test_server-bob" message = "Test message" log_output = capture_log(fn -> assert :ok = MessageServer.Storage.append_message(user_id, from_user, message) end) assert log_output =~ "Message stored for user #{user_id}" end end