117 lines
3.2 KiB
Elixir
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
|