require 'rails_helper' RSpec.describe "Well-known URLs", type: :request do describe "GET /nostr" do describe "without username param" do it "returns a 422 status" do get "/.well-known/nostr.json" expect(response).to have_http_status(:unprocessable_entity) end end describe "non-existent user" do it "returns a 404 status" do get "/.well-known/nostr.json?name=bob" expect(response).to have_http_status(:not_found) end end describe "user does not have a nostr pubkey configured" do let(:user) { create :user, cn: 'spongebob', ou: 'kosmos.org' } before do allow_any_instance_of(User).to receive(:ldap_entry) .and_return({ nostr_key: nil }) end it "returns a 404 status" do get "/.well-known/nostr.json?name=spongebob" expect(response).to have_http_status(:not_found) end end describe "user with nostr pubkey" do let(:user) { create :user, cn: 'bobdylan', ou: 'kosmos.org' } before do user.save! allow_any_instance_of(User).to receive(:nostr_pubkey) .and_return('438d35a6750d0dd6b75d032af8a768aad76b62f0c70ecb45f9c4d9e63540f7f4') end it "returns a NIP-05 response" do get "/.well-known/nostr.json?name=bobdylan" expect(response).to have_http_status(:ok) res = JSON.parse(response.body) expect(res["names"].keys.size).to eq(1) expect(res["names"]["bobdylan"]).to eq(user.nostr_pubkey) end it "returns CORS headers" do get "/.well-known/nostr.json?name=bobdylan" expect(response.headers['Access-Control-Allow-Origin']).to eq("*") expect(response.headers['Access-Control-Allow-Methods']).to eq('GET') end context "without relay configured" do before do Setting.nostr_relay_url = "" end it "does not include a recommended relay" do get "/.well-known/nostr.json?name=bobdylan" res = JSON.parse(response.body) expect(res["relays"]).to be_nil end end context "with relay configured" do before do Setting.nostr_relay_url = "wss://nostr.kosmos.org" end it "includes a recommended relay" do get "/.well-known/nostr.json?name=bobdylan" res = JSON.parse(response.body) expect(res["relays"][user.nostr_pubkey].length).to eq(1) expect(res["relays"][user.nostr_pubkey].first).to eq("wss://nostr.kosmos.org") end end end describe "placeholder username for domain's own pubkey" do describe "for primary domain" do context "no different pubkey configured for primary domain" do it "returns the akkounts nostr pubkey" do get "/.well-known/nostr.json?name=_" res = JSON.parse(response.body) expect(res["names"]["_"]).to eq("bdd76ce2934b2f591f9fad2ebe9da18f20d2921de527494ba00eeaa0a0efadcf") end end context "different pubkey configured for primary domain" do before do Setting.nostr_public_key_primary_domain = "b3e8f62fbe41217ffc0aa1e178d297339932d8ba4f46d9c7df3b61575e78fecc" end it "returns the primary domain's nostr pubkey" do get "/.well-known/nostr.json?name=_" res = JSON.parse(response.body) expect(res["names"]["_"]).to eq("b3e8f62fbe41217ffc0aa1e178d297339932d8ba4f46d9c7df3b61575e78fecc") end end end describe "for akkounts domain" do it "returns the configured nostr pubkey" do headers = { "X-Forwarded-Host" => "accounts.kosmos.org" } get "/.well-known/nostr.json?name=_" res = JSON.parse(response.body) expect(res["names"]["_"]).to eq("bdd76ce2934b2f591f9fad2ebe9da18f20d2921de527494ba00eeaa0a0efadcf") end end context "with relay configured" do before do Setting.nostr_relay_url = "wss://nostr.kosmos.org" end it "returns the pubkey and relay" do get "/.well-known/nostr.json?name=_" res = JSON.parse(response.body) expect(res["relays"]["_"].length).to eq(1) expect(res["relays"]["_"].first).to eq("wss://nostr.kosmos.org") end end context "nostr service integration not enabled" do before do Setting.nostr_enabled = false end it "returns a 404 status" do get "/.well-known/nostr.json?name=_" expect(response).to have_http_status(:not_found) end end end end end