Add language when new user visit context is detected (#20263)

* Add language when new user visit context is detected

* Finalize tests
This commit is contained in:
Ben Halpern 2023-10-20 15:35:41 -04:00 committed by GitHub
parent 2314043432
commit 1da43d9027
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 3 deletions

View file

@ -1,4 +1,27 @@
class UserVisitContext < ApplicationRecord
belongs_to :user
has_many :ahoy_visits, class_name: "Ahoy::Visit", dependent: :nullify
after_create :set_user_language
def set_user_language
# When we detect a new user context, we automatically
# add languages with a weight of greater than 0.7
languages = accept_language.split(",")
languages.map! do |lang|
lang, q = lang.split(";q=")
[lang[0..1], (q || "1").to_f]
end
filtered_languages = languages
.select { |_, q| q >= 0.7 }
.uniq { |lang, _| lang }
filtered_languages.map(&:first).each do |lang|
UserLanguage.where(user_id: user_id, language: lang).first_or_create
end
rescue StandardError => e
Rails.logger.error(e)
end
end

View file

@ -1,5 +1,41 @@
require 'rails_helper'
require "rails_helper"
RSpec.describe UserVisitContext, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
RSpec.describe UserVisitContext do
describe "associations" do
it { is_expected.to belong_to(:user) }
it { is_expected.to have_many(:ahoy_visits).class_name("Ahoy::Visit").dependent(:nullify) }
end
describe "callbacks" do
let(:user) { create(:user) }
let(:user_visit_context) { build(:user_visit_context, user: user) }
it "calls set_user_language after create" do
allow(user_visit_context).to receive(:set_user_language)
user_visit_context.save!
expect(user_visit_context).to have_received(:set_user_language)
end
end
describe "#set_user_language" do
let(:user) { create(:user) }
let(:user_visit_context) { build(:user_visit_context, user: user, accept_language: "en-US;q=0.9,fr-FR;q=0.8") }
it "creates UserLanguage records" do
expect { user_visit_context.set_user_language }
.to change(UserLanguage, :count).by(2)
end
it "logs an error if something goes wrong" do
allow(UserLanguage).to receive(:where).and_raise(StandardError)
allow(Rails.logger).to receive(:error).with(instance_of(StandardError))
user_visit_context.set_user_language
expect(Rails.logger).to have_received(:error).with(instance_of(StandardError))
end
it "matches specific languages" do
user_visit_context.set_user_language
expect(UserLanguage.pluck(:language)).to match_array(%w[en fr])
end
end
end