117 lines
3.2 KiB
Elixir

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