86 lines
3.5 KiB
Ruby
86 lines
3.5 KiB
Ruby
require "test_helper"
|
||
|
||
class BoardTest < ActiveSupport::TestCase
|
||
def setup
|
||
@game = games(:one) # fixturesから取得
|
||
@austria = users(:austria)
|
||
@germany = users(:germany)
|
||
@russia = users(:russia)
|
||
|
||
# 参加者作成(fixtureに依存せず動的に作る方が安全だが簡略化)
|
||
@p_austria = Participant.create!(game: @game, user: @austria, power: "AUSTRIA")
|
||
@p_germany = Participant.create!(game: @game, user: @germany, power: "GERMANY")
|
||
@p_russia = Participant.create!(game: @game, user: @russia, power: "RUSSIA")
|
||
end
|
||
|
||
test "should create global board automatically" do
|
||
new_game = Game.create!(
|
||
title: "New Game",
|
||
status: "recruiting",
|
||
turn_schedule: "0,12",
|
||
participants_count: 7,
|
||
victory_sc_count: 18,
|
||
scoring_system: "none"
|
||
)
|
||
assert new_game.boards.global.exists?
|
||
end
|
||
|
||
test "should create negotiation board" do
|
||
board = @game.boards.new(board_type: "negotiation", created_by_participant_id: @p_austria.id)
|
||
assert board.save
|
||
|
||
# メンバー追加
|
||
board.board_memberships.create!(participant: @p_austria, joined_at: Time.current)
|
||
board.board_memberships.create!(participant: @p_germany, joined_at: Time.current)
|
||
|
||
assert board.member?(@p_austria)
|
||
assert board.member?(@p_germany)
|
||
assert_not board.member?(@p_russia)
|
||
end
|
||
|
||
test "should not allow duplicate member combination" do
|
||
# 既存のボード: Austria & Germany
|
||
board1 = @game.boards.create!(board_type: "negotiation", created_by_participant_id: @p_austria.id)
|
||
board1.board_memberships.create!(participant: @p_austria, joined_at: Time.current)
|
||
board1.board_memberships.create!(participant: @p_germany, joined_at: Time.current)
|
||
|
||
# 新しいボード: Austria & Germany (重複)
|
||
board2 = @game.boards.new(board_type: "negotiation", created_by_participant_id: @p_austria.id)
|
||
board2.board_memberships.build(participant: @p_austria, joined_at: Time.current)
|
||
board2.board_memberships.build(participant: @p_germany, joined_at: Time.current)
|
||
|
||
assert_not board2.valid?
|
||
assert_includes board2.errors[:base], "同じメンバー構成の掲示板がすでに存在します"
|
||
|
||
# メンバーが違えばOK: Austria & Russia
|
||
board3 = @game.boards.new(board_type: "negotiation", created_by_participant_id: @p_austria.id)
|
||
board3.board_memberships.build(participant: @p_austria, joined_at: Time.current)
|
||
board3.board_memberships.build(participant: @p_russia, joined_at: Time.current)
|
||
|
||
assert board3.valid?
|
||
end
|
||
|
||
test "unread count" do
|
||
board = @game.boards.create!(board_type: "negotiation", created_by_participant_id: @p_austria.id)
|
||
m_austria = board.board_memberships.create!(participant: @p_austria, joined_at: Time.current)
|
||
|
||
# 投稿前の未読は0
|
||
assert_equal 0, board.unread_count_for(@p_austria)
|
||
|
||
# 投稿作成
|
||
post1 = board.board_posts.create!(participant: @p_austria, body: "Hello")
|
||
post2 = board.board_posts.create!(participant: @p_austria, body: "World")
|
||
|
||
# Last read が nil なので全件未読扱いにはならない(ロジック上は last_read_post_id || 0 なので `id > 0` の件数になる)
|
||
# `id` はauto incrementで正の数なので、全件カウントされるはず
|
||
assert_equal 2, board.unread_count_for(@p_austria)
|
||
|
||
# 既読更新
|
||
m_austria.mark_read!(post1.id)
|
||
assert_equal 1, board.unread_count_for(@p_austria)
|
||
|
||
m_austria.mark_read!(post2.id)
|
||
assert_equal 0, board.unread_count_for(@p_austria)
|
||
end
|
||
end
|