Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									73b1049a46
								
							
						
					
					
						commit
						2fc143adf9
					
				|  | @ -16,7 +16,9 @@ class Experiment < ApplicationRecord | |||
| 
 | ||||
|   # Create or update the recorded experiment_user row for the user in this experiment. | ||||
|   def record_user_and_group(user, group_type, context = {}) | ||||
|     experiment_users.find_or_initialize_by(user: user).update!(group_type: group_type, context: context) | ||||
|     experiment_user = experiment_users.find_or_initialize_by(user: user) | ||||
|     merged_context = experiment_user.context.deep_merge(context.deep_stringify_keys) | ||||
|     experiment_user.update!(group_type: group_type, context: merged_context) | ||||
|   end | ||||
| 
 | ||||
|   def record_conversion_event_for_user(user) | ||||
|  |  | |||
|  | @ -164,7 +164,7 @@ RSpec.describe Experiment do | |||
|     context 'when an experiment_user already exists for the given user' do | ||||
|       before do | ||||
|         # Create an existing experiment_user for this experiment and the :control group | ||||
|         experiment.record_user_and_group(user, :control, context) | ||||
|         experiment.record_user_and_group(user, :control) | ||||
|       end | ||||
| 
 | ||||
|       it 'does not create a new experiment_user record' do | ||||
|  | @ -173,15 +173,65 @@ RSpec.describe Experiment do | |||
| 
 | ||||
|       context 'but the group_type and context has changed' do | ||||
|         let(:group) { :experimental } | ||||
|         let(:context) { { b: 37 } } | ||||
| 
 | ||||
|         it 'updates the existing experiment_user record with group_type' do | ||||
|           expect { record_user_and_group }.to change { ExperimentUser.last.group_type } | ||||
|         end | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|         it 'updates the existing experiment_user record with context' do | ||||
|     context 'when a context already exists' do | ||||
|       let_it_be(:context) { { a: 42, 'b' => 34, 'c': { c1: 100, c2: 'c2', e: :e }, d: [1, 3] } } | ||||
|       let_it_be(:initial_expected_context) { { 'a' => 42, 'b' => 34, 'c' => { 'c1' => 100, 'c2' => 'c2', 'e' => 'e' }, 'd' => [1, 3] } } | ||||
| 
 | ||||
|       before do | ||||
|         record_user_and_group | ||||
|           expect(ExperimentUser.last.context).to eq({ 'b' => 37 }) | ||||
|         experiment.record_user_and_group(user, :control, {}) | ||||
|       end | ||||
| 
 | ||||
|       it 'has an initial context with stringified keys' do | ||||
|         expect(ExperimentUser.last.context).to eq(initial_expected_context) | ||||
|       end | ||||
| 
 | ||||
|       context 'when updated' do | ||||
|         before do | ||||
|           record_user_and_group | ||||
|           experiment.record_user_and_group(user, :control, new_context) | ||||
|         end | ||||
| 
 | ||||
|         context 'with an empty context' do | ||||
|           let_it_be(:new_context) { {} } | ||||
| 
 | ||||
|           it 'keeps the initial context' do | ||||
|             expect(ExperimentUser.last.context).to eq(initial_expected_context) | ||||
|           end | ||||
|         end | ||||
| 
 | ||||
|         context 'with string keys' do | ||||
|           let_it_be(:new_context) { { f: :some_symbol } } | ||||
| 
 | ||||
|           it 'adds new symbols stringified' do | ||||
|             expected_context = initial_expected_context.merge('f' => 'some_symbol') | ||||
|             expect(ExperimentUser.last.context).to eq(expected_context) | ||||
|           end | ||||
|         end | ||||
| 
 | ||||
|         context 'with atomic values or array values' do | ||||
|           let_it_be(:new_context) { { b: 97, d: [99] } } | ||||
| 
 | ||||
|           it 'overrides the values' do | ||||
|             expected_context = { 'a' => 42, 'b' => 97, 'c' => { 'c1' => 100, 'c2' => 'c2', 'e' => 'e' }, 'd' => [99] } | ||||
|             expect(ExperimentUser.last.context).to eq(expected_context) | ||||
|           end | ||||
|         end | ||||
| 
 | ||||
|         context 'with nested hashes' do | ||||
|           let_it_be(:new_context) { { c: { g: 107 } } } | ||||
| 
 | ||||
|           it 'inserts nested additional values in the same keys' do | ||||
|             expected_context = initial_expected_context.deep_merge('c' => { 'g' => 107 }) | ||||
|             expect(ExperimentUser.last.context).to eq(expected_context) | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue