diff --git a/app/models/user_visit_context.rb b/app/models/user_visit_context.rb index f52e47a75..630ab2851 100644 --- a/app/models/user_visit_context.rb +++ b/app/models/user_visit_context.rb @@ -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 diff --git a/spec/models/user_visit_context_spec.rb b/spec/models/user_visit_context_spec.rb index 584e35ca6..7469afb3b 100644 --- a/spec/models/user_visit_context_spec.rb +++ b/spec/models/user_visit_context_spec.rb @@ -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