From 58cc6811f9768300af1915dff58f04fb68cc0a3c Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Wed, 3 Feb 2021 13:16:47 +0100 Subject: [PATCH] Move XMPP contacts exchange to background job --- app/jobs/exchange_xmpp_contacts_job.rb | 18 ++++++++++++++ app/services/create_account.rb | 17 ++----------- spec/jobs/exchange_xmpp_contacts_job_spec.rb | 24 +++++++++++++++++++ spec/services/create_account_spec.rb | 25 ++++++++++---------- 4 files changed, 57 insertions(+), 27 deletions(-) create mode 100644 app/jobs/exchange_xmpp_contacts_job.rb create mode 100644 spec/jobs/exchange_xmpp_contacts_job_spec.rb diff --git a/app/jobs/exchange_xmpp_contacts_job.rb b/app/jobs/exchange_xmpp_contacts_job.rb new file mode 100644 index 0000000..5e5caa2 --- /dev/null +++ b/app/jobs/exchange_xmpp_contacts_job.rb @@ -0,0 +1,18 @@ +class ExchangeXmppContactsJob < ApplicationJob + queue_as :default + + def perform(inviter, username, domain) + ejabberd = EjabberdApiClient.new + + ejabberd.add_rosteritem({ + "localuser": username, "localhost": domain, + "user": inviter.cn, "host": inviter.ou, + "nick": inviter.cn, "group": "Friends", "subs": "both" + }) + ejabberd.add_rosteritem({ + "localuser": inviter.cn, "localhost": inviter.ou, + "user": username, "host": domain, + "nick": username, "group": "Friends", "subs": "both" + }) + end +end diff --git a/app/services/create_account.rb b/app/services/create_account.rb index e31a01d..64901d4 100644 --- a/app/services/create_account.rb +++ b/app/services/create_account.rb @@ -36,25 +36,12 @@ class CreateAccount < ApplicationService # TODO move to confirmation def add_ldap_document hashed_pw = Devise.ldap_auth_password_builder.call(@password) - CreateLdapUserJob.perform_later(@username, "kosmos.org", @email, hashed_pw) + CreateLdapUserJob.perform_later(@username, @domain, @email, hashed_pw) end def exchange_xmpp_contacts #TODO enable in development when we have easy setup of ejabberd etc. return if Rails.env.development? - - ejabberd = EjabberdApiClient.new - inviter = @invitation.user - - ejabberd.add_rosteritem({ - "localuser": @username, "localhost": @domain, - "user": inviter.cn, "host": inviter.ou, - "nick": inviter.cn, "group": "Friends", "subs": "both" - }) - ejabberd.add_rosteritem({ - "localuser": inviter.cn, "localhost": inviter.ou, - "user": @username, "host": @domain, - "nick": @username, "group": "Friends", "subs": "both" - }) + ExchangeXmppContactsJob.perform_later(@invitation.user, @username, @domain) end end diff --git a/spec/jobs/exchange_xmpp_contacts_job_spec.rb b/spec/jobs/exchange_xmpp_contacts_job_spec.rb new file mode 100644 index 0000000..1737c14 --- /dev/null +++ b/spec/jobs/exchange_xmpp_contacts_job_spec.rb @@ -0,0 +1,24 @@ +require 'rails_helper' +require 'webmock/rspec' + +RSpec.describe ExchangeXmppContactsJob, type: :job do + let(:user) { create :user, cn: "willherschel", ou: "kosmos.org" } + + subject(:job) { + described_class.perform_later(user, 'isaacnewton', 'kosmos.org') + } + + before do + stub_request(:post, "http://xmpp.example.com/api/add_rosteritem") + .to_return(status: 200, body: "", headers: {}) + end + + it "posts add_rosteritem commands to the ejabberd API" do + perform_enqueued_jobs { job } + + expect(WebMock).to have_requested(:post, "http://xmpp.example.com/api/add_rosteritem") + .with { |req| req.body == '{"localuser":"isaacnewton","localhost":"kosmos.org","user":"willherschel","host":"kosmos.org","nick":"willherschel","group":"Friends","subs":"both"}' } + expect(WebMock).to have_requested(:post, "http://xmpp.example.com/api/add_rosteritem") + .with { |req| req.body == '{"localuser":"willherschel","localhost":"kosmos.org","user":"isaacnewton","host":"kosmos.org","nick":"isaacnewton","group":"Friends","subs":"both"}' } + end +end diff --git a/spec/services/create_account_spec.rb b/spec/services/create_account_spec.rb index f90ecfc..e010735 100644 --- a/spec/services/create_account_spec.rb +++ b/spec/services/create_account_spec.rb @@ -1,6 +1,4 @@ require 'rails_helper' -require 'webmock/rspec' -require 'json' RSpec.describe CreateAccount, type: :model do describe "#create_user_in_database" do @@ -68,6 +66,8 @@ RSpec.describe CreateAccount, type: :model do end describe "#exchange_xmpp_contacts" do + include ActiveJob::TestHelper + let(:inviter) { create :user, cn: "willherschel", ou: "kosmos.org" } let(:invitation) { create :invitation, user: inviter } let(:service) { CreateAccount.new( @@ -77,18 +77,19 @@ RSpec.describe CreateAccount, type: :model do invitation: invitation )} - before do - stub_request(:post, "http://xmpp.example.com/api/add_rosteritem") - .to_return(status: 200, body: "", headers: {}) - end - - it "posts add_rosteritem commands to the ejabberd API" do + it "enqueues a job to exchange XMPP contacts between inviter and invitee" do service.send(:exchange_xmpp_contacts) - expect(WebMock).to have_requested(:post, "http://xmpp.example.com/api/add_rosteritem") - .with { |req| req.body == '{"localuser":"isaacnewton","localhost":"kosmos.org","user":"willherschel","host":"kosmos.org","nick":"willherschel","group":"Friends","subs":"both"}' } - expect(WebMock).to have_requested(:post, "http://xmpp.example.com/api/add_rosteritem") - .with { |req| req.body == '{"localuser":"willherschel","localhost":"kosmos.org","user":"isaacnewton","host":"kosmos.org","nick":"isaacnewton","group":"Friends","subs":"both"}' } + expect(enqueued_jobs.size).to eq(1) + + args = enqueued_jobs.first['arguments'] + expect(args[0]['_aj_globalid']).to match('gid://akkounts/User') + expect(args[1]).to eq('isaacnewton') + expect(args[2]).to eq('kosmos.org') + end + + after do + clear_enqueued_jobs end end end