defmodule MessageServer.StorageTest do use ExUnit.Case alias MessageServer.Storage @test_server_id "1" @test_storage_dir "storage/server_#{@test_server_id}" setup do pid = start_supervised!({Storage, {@test_server_id, :test_storage}}) on_exit(fn -> File.rm_rf!(@test_storage_dir) end) %{storage: pid, storage_dir: @test_storage_dir} end test "creates storage directory on startup", %{storage_dir: storage_dir} do assert File.exists?(storage_dir) assert File.dir?(storage_dir) end test "appends message to user file", %{storage_dir: storage_dir} do user_id = "zoidberg" from_user = "bender" message = "let's go steal some stuff" assert :ok = Storage.append_message(user_id, from_user, message) file_path = Path.join(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", %{storage_dir: storage_dir} do user_id = "leela" assert :ok = MessageServer.Storage.append_message(user_id, "fry", "i love you leela") assert :ok = MessageServer.Storage.append_message( user_id, "bender", "bite my shiny metal ass!" ) file_path = Path.join(storage_dir, "#{user_id}.txt") content = File.read!(file_path) expected_content = """ fry: i love you leela bender: bite my shiny metal ass! """ assert content == expected_content end test "creates separate files for different users", %{storage_dir: storage_dir} do assert :ok = MessageServer.Storage.append_message( "fry", "professor", "good news everyone!" ) assert :ok = MessageServer.Storage.append_message( "nibbler", "zoidberg", "hooray! people are paying attention to me!" ) fry_file = Path.join(storage_dir, "fry.txt") nibbler_file = Path.join(storage_dir, "nibbler.txt") assert File.exists?(fry_file) assert File.exists?(nibbler_file) assert File.read!(fry_file) == "professor: good news everyone!\n" assert File.read!(nibbler_file) == "zoidberg: hooray! people are paying attention to me!\n" end test "handles messages with special characters", %{storage_dir: storage_dir} do user_id = "zapp" from_user = "zoidberg" message = "why not zoidberg? 🦀 (╯°□°)╯︵ ┻━┻" assert :ok = MessageServer.Storage.append_message(user_id, from_user, message) file_path = Path.join(storage_dir, "#{user_id}.txt") content = File.read!(file_path) assert content == "#{from_user}: #{message}\n" end end