Merge branch 'master' into feature/default_chatrooms
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
Release Drafter / Update release notes draft (pull_request) Successful in 4s

This commit is contained in:
Râu Cao
2023-04-18 17:00:48 +02:00
44 changed files with 540 additions and 139 deletions

View File

@@ -46,5 +46,26 @@ RSpec.describe 'Admin/global settings', type: :feature do
expect(page).to_not have_checked_field("setting[ejabberd_enabled]")
expect(page).to_not have_field("API URL", disabled: true)
end
scenario "View remoteStorage settings" do
visit admin_settings_services_path(params: { s: "remotestorage" })
expect(page).to have_content("Enable RemoteStorage integration")
expect(page).to have_field("Storage URL",
with: "https://storage.kosmos.org",
disabled: true)
end
scenario "Disable remoteStorage integration" do
visit admin_settings_services_path(params: { s: "remotestorage" })
expect(page).to have_checked_field("setting[remotestorage_enabled]")
uncheck "setting[remotestorage_enabled]"
click_button "Save"
expect(current_url).to eq(admin_settings_services_url(params: { s: "remotestorage" }))
expect(page).to_not have_checked_field("setting[remotestorage_enabled]")
expect(page).to_not have_field("Storage URL", disabled: true)
end
end
end

View File

@@ -53,11 +53,11 @@ RSpec.describe "Signup", type: :feature do
expect(page).to have_content("Choose a password")
expect(CreateAccount).to receive(:call)
.with(
.with({
username: "tony", domain: "kosmos.org",
email: "tony@example.com", password: "a-valid-password",
invitation: Invitation.last
).and_return(true)
}).and_return(true)
fill_in "user_password", with: "a-valid-password"
click_button "Create account"
@@ -97,11 +97,11 @@ RSpec.describe "Signup", type: :feature do
expect(page).to have_content("Password is too short")
expect(CreateAccount).to receive(:call)
.with(
.with({
username: "tony", domain: "kosmos.org",
email: "tony@example.com", password: "a-valid-password",
invitation: Invitation.last
).and_return(true)
}).and_return(true)
fill_in "user_password", with: "a-valid-password"
click_button "Create account"

View File

@@ -13,7 +13,7 @@ RSpec.describe XmppExchangeContactsJob, type: :job do
before do
stub_request(:post, "http://xmpp.example.com/api/add_rosteritem")
.to_return(status: 200, body: "", headers: {})
allow_any_instance_of(User).to receive(:services_enabled).and_return(["ejabberd"])
allow_any_instance_of(User).to receive(:services_enabled).and_return(["xmpp"])
end
it "posts add_rosteritem commands to the ejabberd API" do

View File

@@ -0,0 +1,41 @@
require 'rails_helper'
RSpec.describe UserPreferences, type: :model do
let(:default_prefs) { YAML.load_file("#{Rails.root}/config/default_preferences.yml") }
describe ".load" do
it "provides default values when no preferences are stored yet" do
expect(UserPreferences.load(nil)).to eq(default_prefs)
end
it "provides default values for unset preferences" do
prefs = UserPreferences.load("lightning_notify_sats_received: xmpp")
expect(prefs[:lightning_notify_sats_received]).to eq("xmpp")
expect(prefs[:xmpp_exchange_contacts_with_invitees]).to eq(true)
end
end
describe ".process" do
it "turns all keys into strings" do
res = UserPreferences.process({ foo: "bar" })
expect(res[:foo]).to be(nil)
expect(res['foo']).to eq("bar")
end
it "converts value 'true' to boolean" do
res = UserPreferences.process({ lightning_notify_sats_received: "true" })
expect(res['lightning_notify_sats_received']).to be(true)
end
it "converts value 'false' to boolean" do
res = UserPreferences.process({ lightning_notify_sats_received: "false" })
expect(res['lightning_notify_sats_received']).to be(false)
end
it "converts value string with integer into integer" do
res = UserPreferences.process({ lightning_notify_sats_received_threshold: 1000 })
expect(res['lightning_notify_sats_received_threshold']).to be_a(Integer)
expect(res['lightning_notify_sats_received_threshold']).to eq(1000)
end
end
end

View File

@@ -108,7 +108,7 @@ RSpec.describe User, type: :model do
let(:user) { create :user, cn: "willherschel", ou: "kosmos.org" }
it "enables default services" do
expect(user).to receive(:enable_service).with(%w[ discourse ejabberd gitea mediawiki ])
expect(user).to receive(:enable_service).with(%w[ discourse gitea mediawiki xmpp ])
user.send :devise_after_confirmation
end
@@ -120,10 +120,12 @@ RSpec.describe User, type: :model do
expect(job['arguments'][0]['_aj_globalid']).to eq('gid://akkounts/User/1')
end
context "for invited user with ejabberd enabled" do
context "for invited user with xmpp enabled" do
let(:guest) { create :user, id: 2, cn: "isaacnewton", ou: "kosmos.org", email: "newt@example.com" }
before do
# TODO remove when defaults are implemented
user.update! preferences: { xmpp_exchange_contacts_with_invitees: true }
Invitation.create! user: user, invited_user_id: guest.id, used_at: DateTime.now
allow_any_instance_of(User).to receive(:enable_service)
end

View File

@@ -0,0 +1,49 @@
require 'rails_helper'
RSpec.describe "WebFinger", type: :request do
describe "remoteStorage link relation" do
context "user exists" do
before do
create :user, cn: 'tony', ou: 'kosmos.org'
end
context "remoteStorage enabled globally" do
it "includes the remoteStorage link for the user" do
get "/.well-known/webfinger?resource=acct%3Atony%40kosmos.org"
expect(response).to have_http_status(:ok)
res = JSON.parse(response.body)
rs_link = res["links"].find {|l| l["rel"] == "http://tools.ietf.org/id/draft-dejong-remotestorage"}
expect(rs_link["href"]).to eql("https://storage.kosmos.org/tony@kosmos.org")
oauth_url = rs_link["properties"]["http://tools.ietf.org/html/rfc6749#section-4.2"]
expect(oauth_url).to eql("https://example.com/rs/oauth")
end
end
context "remoteStorage not available" do
before do
Setting.remotestorage_enabled = false
end
it "does not include the remoteStorage link" do
get "/.well-known/webfinger?resource=acct%3Atony%40kosmos.org"
expect(response).to have_http_status(:ok)
res = JSON.parse(response.body)
rs_link = res["links"].find {|l| l["rel"] == "http://tools.ietf.org/id/draft-dejong-remotestorage"}
expect(rs_link).to be_nil
end
end
end
context "user does not exist" do
it "does return a 404 status" do
get "/.well-known/webfinger?resource=acct%3Ajane.doe%40kosmos.org"
expect(response).to have_http_status(:not_found)
end
end
end
end

View File

@@ -55,22 +55,51 @@ RSpec.describe "Webhooks", type: :request do
before do
user.save! #FIXME this should not be necessary
post "/webhooks/lndhub", params: payload.to_json
end
it "returns a 200 status" do
post "/webhooks/lndhub", params: payload.to_json
expect(response).to have_http_status(:ok)
end
it "sends an XMPP message to the account owner's JID" do
expect(enqueued_jobs.size).to eq(1)
it "does not send notifications by default" do
expect(enqueued_jobs.size).to eq(0)
end
msg = enqueued_jobs.first['arguments'].first
expect(msg["type"]).to eq('normal')
expect(msg["from"]).to eq('kosmos.org')
expect(msg["to"]).to eq(user.address)
expect(msg["subject"]).to eq('Sats received!')
expect(msg["body"]).to match(/^12300 sats received/)
context "notification preference set to 'xmpp'" do
before do
user.update! preferences: { lightning_notify_sats_received: "xmpp" }
post "/webhooks/lndhub", params: payload.to_json
end
it "sends an XMPP message to the account owner's JID" do
expect(enqueued_jobs.size).to eq(1)
expect(enqueued_jobs.first["job_class"]).to eq("XmppSendMessageJob")
msg = enqueued_jobs.first["arguments"].first
expect(msg["type"]).to eq("normal")
expect(msg["from"]).to eq("kosmos.org")
expect(msg["to"]).to eq(user.address)
expect(msg["subject"]).to eq("Sats received!")
expect(msg["body"]).to match(/^12,300 sats received/)
end
end
context "notification preference set to 'email'" do
before do
user.update! preferences: { lightning_notify_sats_received: "email" }
post "/webhooks/lndhub", params: payload.to_json
end
it "sends an email notification to the account owner" do
expect(enqueued_jobs.size).to eq(1)
expect(enqueued_jobs.first["job_class"]).to eq("ActionMailer::MailDeliveryJob")
args = enqueued_jobs.first['arguments']
expect(args[0]).to eq("NotificationMailer")
expect(args[1]).to eq("lightning_sats_received")
expect(args[3]["params"]["user"]["_aj_globalid"]).to eq("gid://akkounts/User/1")
expect(args[3]["params"]["amount_sats"]).to eq(12300)
end
end
end
end