ぼざクリタグ広場 https://hub.nizika.monster
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

111 lines
3.6 KiB

  1. require "rails_helper"
  2. RSpec.describe "Users", type: :request do
  3. describe "POST /users" do
  4. it "creates guest user and returns code" do
  5. post "/users"
  6. expect(response).to have_http_status(:ok)
  7. expect(json["code"]).to be_present
  8. expect(json["user"]["role"]).to eq("guest")
  9. end
  10. end
  11. describe "POST /users/code/renew" do
  12. it "returns 401 when not logged in" do
  13. sign_out
  14. post "/users/code/renew"
  15. expect(response).to have_http_status(:unauthorized)
  16. end
  17. end
  18. describe "PUT /users/:id" do
  19. let(:user) { create(:user, name: "old-name", role: "guest") }
  20. it "returns 401 when current_user id mismatch" do
  21. sign_in_as(create(:user))
  22. put "/users/#{user.id}", params: { name: "new-name" }
  23. expect(response).to have_http_status(:unauthorized)
  24. end
  25. it "returns 400 when name is blank" do
  26. sign_in_as(user)
  27. put "/users/#{user.id}", params: { name: " " }
  28. expect(response).to have_http_status(:bad_request)
  29. end
  30. it "updates name and returns 201 with user slice" do
  31. sign_in_as(user)
  32. put "/users/#{user.id}", params: { name: "new-name" }
  33. expect(response).to have_http_status(:created)
  34. expect(json["id"]).to eq(user.id)
  35. expect(json["name"]).to eq("new-name")
  36. user.reload
  37. expect(user.name).to eq("new-name")
  38. end
  39. end
  40. describe "POST /users/verify" do
  41. it "returns valid:false when code not found" do
  42. post "/users/verify", params: { code: "nope" }
  43. expect(response).to have_http_status(:ok)
  44. expect(json["valid"]).to eq(false)
  45. end
  46. it "creates IpAddress and UserIp, and returns valid:true with user slice" do
  47. user = create(:user, inheritance_code: SecureRandom.uuid, role: "guest")
  48. # request.remote_ip を固定
  49. allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return("203.0.113.10")
  50. expect {
  51. post "/users/verify", params: { code: user.inheritance_code }
  52. }.to change(UserIp, :count).by(1)
  53. expect(response).to have_http_status(:ok)
  54. expect(json["valid"]).to eq(true)
  55. expect(json["user"]["id"]).to eq(user.id)
  56. expect(json["user"]["inheritance_code"]).to eq(user.inheritance_code)
  57. expect(json["user"]["role"]).to eq("guest")
  58. # ついでに IpAddress もできてることを確認(ipの保存形式がバイナリでも count で見れる)
  59. expect(IpAddress.count).to be >= 1
  60. end
  61. it "is idempotent for same user+ip (does not create duplicate UserIp)" do
  62. user = create(:user, inheritance_code: SecureRandom.uuid, role: "guest")
  63. allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return("203.0.113.10")
  64. post "/users/verify", params: { code: user.inheritance_code }
  65. expect(response).to have_http_status(:ok)
  66. expect {
  67. post "/users/verify", params: { code: user.inheritance_code }
  68. }.not_to change(UserIp, :count)
  69. expect(response).to have_http_status(:ok)
  70. expect(json["valid"]).to eq(true)
  71. end
  72. end
  73. describe "GET /users/me" do
  74. it "returns 404 when code not found" do
  75. get "/users/me", params: { code: "nope" }
  76. expect(response).to have_http_status(:not_found)
  77. end
  78. it "returns user slice when found" do
  79. user = create(:user, inheritance_code: SecureRandom.uuid, name: "me", role: "guest")
  80. get "/users/me", params: { code: user.inheritance_code }
  81. expect(response).to have_http_status(:ok)
  82. expect(json["id"]).to eq(user.id)
  83. expect(json["name"]).to eq("me")
  84. expect(json["inheritance_code"]).to eq(user.inheritance_code)
  85. expect(json["role"]).to eq("guest")
  86. end
  87. end
  88. end