def test_incomplete_and_default_flags(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) state_name = exp.init_state_name # Hit the default rule once, and fail to answer twice. The result # should be classified as incomplete. for _ in range(3): event_services.StateHitEventHandler.record('eid', state_name, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') self.assertEquals(stats_services.get_state_improvements('eid'), [{ 'rank': 2, 'type': 'incomplete', 'state_name': state_name }]) # Now hit the default two more times. The result should be classified # as default. for i in range(2): event_services.StateHitEventHandler.record('eid', state_name, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') self.assertEquals(stats_services.get_state_improvements('eid'), [{ 'rank': 3, 'type': 'default', 'state_name': state_name }])
def test_incomplete_and_default_flags(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) state_name = exp.init_state_name # Hit the default rule once, and fail to answer twice. The result # should be classified as incomplete. for _ in range(3): event_services.StateHitEventHandler.record( 'eid', state_name, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') self.assertEquals(stats_services.get_state_improvements('eid'), [{ 'rank': 2, 'type': 'incomplete', 'state_name': state_name }]) # Now hit the default two more times. The result should be classified # as default. for i in range(2): event_services.StateHitEventHandler.record( 'eid', state_name, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') self.assertEquals(stats_services.get_state_improvements('eid'), [{ 'rank': 3, 'type': 'default', 'state_name': state_name }])
def test_incomplete_and_default_flags(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) state_name = exp.init_state_name # Fail to answer twice. for i in range(2): event_services.StartExplorationEventHandler.record( 'eid', 1, state_name, 'session_id %d' % i, {}, feconf.PLAY_TYPE_NORMAL) event_services.StateHitEventHandler.record('eid', 1, state_name, 'session_id %d' % i, {}, feconf.PLAY_TYPE_NORMAL) event_services.MaybeLeaveExplorationEventHandler.record( 'eid', 1, state_name, 'session_id %d' % i, 10.0, {}, feconf.PLAY_TYPE_NORMAL) # Hit the default rule once. event_services.StateHitEventHandler.record('eid', 1, state_name, 'session_id 3', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, self.DEFAULT_RULESPEC_STR, '1') # The result should be classified as incomplete. ModifiedStatisticsAggregator.start_computation() self.process_and_flush_pending_tasks() with self.swap(stats_jobs_continuous.StatisticsAggregator, 'get_statistics', ModifiedStatisticsAggregator.get_statistics): self.assertEquals(stats_services.get_state_improvements('eid', 1), [{ 'rank': 2, 'type': 'incomplete', 'state_name': state_name }]) # Now hit the default two more times. The result should be classified # as default. for i in range(2): event_services.StateHitEventHandler.record('eid', 1, state_name, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, self.DEFAULT_RULESPEC_STR, '1') with self.swap(stats_jobs_continuous.StatisticsAggregator, 'get_statistics', ModifiedStatisticsAggregator.get_statistics): self.assertEquals(stats_services.get_state_improvements('eid', 1), [{ 'rank': 3, 'type': 'default', 'state_name': state_name }])
def test_two_state_default_hit(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) FIRST_STATE_NAME = exp.init_state_name SECOND_STATE_NAME = 'State 2' exp.add_states([SECOND_STATE_NAME]) exp_services._save_exploration('*****@*****.**', exp, '', []) # Hit the default rule of state 1 once, and the default rule of state 2 # twice. event_services.StateHitEventHandler.record('eid', FIRST_STATE_NAME, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, FIRST_STATE_NAME, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') for i in range(2): event_services.StateHitEventHandler.record('eid', SECOND_STATE_NAME, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, SECOND_STATE_NAME, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') states = stats_services.get_state_improvements('eid') self.assertEquals(states, [{ 'rank': 2, 'type': 'default', 'state_name': SECOND_STATE_NAME }, { 'rank': 1, 'type': 'default', 'state_name': FIRST_STATE_NAME }]) # Hit the default rule of state 1 two more times. for i in range(2): event_services.StateHitEventHandler.record('eid', FIRST_STATE_NAME, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, FIRST_STATE_NAME, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') states = stats_services.get_state_improvements('eid') self.assertEquals(states, [{ 'rank': 3, 'type': 'default', 'state_name': FIRST_STATE_NAME }, { 'rank': 2, 'type': 'default', 'state_name': SECOND_STATE_NAME }])
def test_incomplete_and_default_flags(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) state_name = exp.init_state_name # Fail to answer twice. for i in range(2): event_services.StartExplorationEventHandler.record( 'eid', 1, state_name, 'session_id %d' % i, {}, feconf.PLAY_TYPE_NORMAL) event_services.StateHitEventHandler.record( 'eid', 1, state_name, 'session_id %d' % i, {}, feconf.PLAY_TYPE_NORMAL) event_services.MaybeLeaveExplorationEventHandler.record( 'eid', 1, state_name, 'session_id %d' % i, 10.0, {}, feconf.PLAY_TYPE_NORMAL) # Hit the default rule once. event_services.StateHitEventHandler.record( 'eid', 1, state_name, 'session_id 3', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, feconf.SUBMIT_HANDLER_NAME, self.DEFAULT_RULESPEC, '1') # The result should be classified as incomplete. ModifiedStatisticsAggregator.start_computation() self.process_and_flush_pending_tasks() with self.swap(stats_jobs.StatisticsAggregator, 'get_statistics', ModifiedStatisticsAggregator.get_statistics): self.assertEquals( stats_services.get_state_improvements('eid', 1), [{ 'rank': 2, 'type': 'incomplete', 'state_name': state_name }]) # Now hit the default two more times. The result should be classified # as default. for i in range(2): event_services.StateHitEventHandler.record( 'eid', 1, state_name, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, feconf.SUBMIT_HANDLER_NAME, self.DEFAULT_RULESPEC, '1') with self.swap(stats_jobs.StatisticsAggregator, 'get_statistics', ModifiedStatisticsAggregator.get_statistics): self.assertEquals( stats_services.get_state_improvements('eid', 1), [{ 'rank': 3, 'type': 'default', 'state_name': state_name }])
def test_two_state_default_hit(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) FIRST_STATE_NAME = exp.init_state_name SECOND_STATE_NAME = 'State 2' exp.add_states([SECOND_STATE_NAME]) exp_services._save_exploration('*****@*****.**', exp, '', []) # Hit the default rule of state 1 once, and the default rule of state 2 # twice. event_services.StateHitEventHandler.record( 'eid', FIRST_STATE_NAME, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, FIRST_STATE_NAME, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') for i in range(2): event_services.StateHitEventHandler.record( 'eid', SECOND_STATE_NAME, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, SECOND_STATE_NAME, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') states = stats_services.get_state_improvements('eid') self.assertEquals(states, [{ 'rank': 2, 'type': 'default', 'state_name': SECOND_STATE_NAME }, { 'rank': 1, 'type': 'default', 'state_name': FIRST_STATE_NAME }]) # Hit the default rule of state 1 two more times. for i in range(2): event_services.StateHitEventHandler.record( 'eid', FIRST_STATE_NAME, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, FIRST_STATE_NAME, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') states = stats_services.get_state_improvements('eid') self.assertEquals(states, [{ 'rank': 3, 'type': 'default', 'state_name': FIRST_STATE_NAME }, { 'rank': 2, 'type': 'default', 'state_name': SECOND_STATE_NAME }])
def test_get_state_improvements(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) for ind in range(5): event_services.StartExplorationEventHandler.record( 'eid', 1, exp.init_state_name, 'session_id_%s' % ind, {}, feconf.PLAY_TYPE_NORMAL) event_services.StateHitEventHandler.record('eid', 1, exp.init_state_name, 'session_id_%s' % ind, {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, exp.init_state_name, self.DEFAULT_RULESPEC_STR, '1') for _ in range(2): event_services.AnswerSubmissionEventHandler.record( 'eid', 1, exp.init_state_name, self.DEFAULT_RULESPEC_STR, '2') ModifiedStatisticsAggregator.start_computation() self.process_and_flush_pending_tasks() with self.swap(stats_jobs_continuous.StatisticsAggregator, 'get_statistics', ModifiedStatisticsAggregator.get_statistics): self.assertEquals(stats_services.get_state_improvements('eid', 1), [{ 'type': 'default', 'rank': 3, 'state_name': exp.init_state_name }])
def test_get_state_improvements(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) for ind in range(5): event_services.StartExplorationEventHandler.record( 'eid', 1, exp.init_state_name, 'session_id_%s' % ind, {}, feconf.PLAY_TYPE_NORMAL) event_services.StateHitEventHandler.record( 'eid', 1, exp.init_state_name, 'session_id_%s' % ind, {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, exp.init_state_name, self.DEFAULT_RULESPEC_STR, '1') for _ in range(2): event_services.AnswerSubmissionEventHandler.record( 'eid', 1, exp.init_state_name, self.DEFAULT_RULESPEC_STR, '2') ModifiedStatisticsAggregator.start_computation() self.process_and_flush_pending_tasks() with self.swap(stats_jobs.StatisticsAggregator, 'get_statistics', ModifiedStatisticsAggregator.get_statistics): self.assertEquals( stats_services.get_state_improvements('eid', 1), [{ 'type': 'default', 'rank': 3, 'state_name': exp.init_state_name }])
def test_no_improvement_flag_hit(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) not_default_rule_spec = exp_domain.RuleSpec( { 'rule_type': rule_domain.ATOMIC_RULE_TYPE, 'name': 'NotDefault', 'inputs': {}, 'subject': 'answer' }, exp.init_state_name, [], [], 'NormalizedString') default_rule_spec = exp_domain.RuleSpec.get_default_rule_spec( feconf.END_DEST, 'NormalizedString') exp.init_state.widget.handlers[0].rule_specs = [ not_default_rule_spec, default_rule_spec ] exp_services._save_exploration('*****@*****.**', exp, '', []) event_services.StateHitEventHandler.record('eid', exp.init_state_name, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, exp.init_state_name, self.SUBMIT_HANDLER, not_default_rule_spec, '1') self.assertEquals(stats_services.get_state_improvements('eid'), [])
def test_single_default_rule_hit(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) state_name = exp.init_state_name event_services.StateHitEventHandler.record('eid', state_name, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') self.assertEquals(stats_services.get_state_improvements('eid'), [{ 'type': 'default', 'rank': 1, 'state_name': exp.init_state_name }])
def test_single_default_rule_hit(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) state_name = exp.init_state_name event_services.StateHitEventHandler.record('eid', state_name, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, self.SUBMIT_HANDLER, self.DEFAULT_RULESPEC, '1') self.assertEquals(stats_services.get_state_improvements('eid'), [{ 'type': 'default', 'rank': 1, 'state_name': exp.init_state_name }])
def get(self, exploration_id): """Handles GET requests.""" try: exp_services.get_exploration_by_id(exploration_id) except: raise self.PageNotFoundException self.render_json({ 'num_starts': stats_services.get_exploration_start_count( exploration_id), 'num_completions': stats_services.get_exploration_completed_count( exploration_id), 'state_stats': stats_services.get_state_stats_for_exploration( exploration_id), 'improvements': stats_services.get_state_improvements( exploration_id), })
def test_no_improvement_flag_hit(self): self.save_new_valid_exploration( 'eid', '*****@*****.**', end_state_name='End') exp = exp_services.get_exploration_by_id('eid') not_default_rule_spec = exp_domain.RuleSpec('Equals', {'x': 'Text'}) init_interaction = exp.init_state.interaction init_interaction.answer_groups.append(exp_domain.AnswerGroup( exp_domain.Outcome(exp.init_state_name, [], {}), [not_default_rule_spec])) init_interaction.default_outcome = exp_domain.Outcome( 'End', [], {}) exp_services._save_exploration('*****@*****.**', exp, '', []) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, exp.init_state_name, not_default_rule_spec.stringify_classified_rule(), '1') self.assertEquals(stats_services.get_state_improvements('eid', 1), [])
def test_no_improvement_flag_hit(self): self.save_new_valid_exploration('eid', '*****@*****.**', end_state_name='End') exp = exp_services.get_exploration_by_id('eid') not_default_rule_spec = exp_domain.RuleSpec('Equals', {'x': 'Text'}) init_interaction = exp.init_state.interaction init_interaction.answer_groups.append( exp_domain.AnswerGroup( exp_domain.Outcome(exp.init_state_name, [], {}), [not_default_rule_spec])) init_interaction.default_outcome = exp_domain.Outcome('End', [], {}) exp_services._save_exploration('*****@*****.**', exp, '', []) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, exp.init_state_name, not_default_rule_spec.stringify_classified_rule(), '1') self.assertEquals(stats_services.get_state_improvements('eid', 1), [])
def test_no_improvement_flag_hit(self): self.save_new_valid_exploration('eid', '*****@*****.**') exp = exp_services.get_exploration_by_id('eid') not_default_rule_spec = exp_domain.RuleSpec({ 'rule_type': rule_domain.ATOMIC_RULE_TYPE, 'name': 'NotDefault', 'inputs': {}, 'subject': 'answer' }, exp.init_state_name, [], [], 'NormalizedString') default_rule_spec = exp_domain.RuleSpec.get_default_rule_spec( feconf.END_DEST, 'NormalizedString') exp.init_state.interaction.handlers[0].rule_specs = [ not_default_rule_spec, default_rule_spec ] exp_services._save_exploration('*****@*****.**', exp, '', []) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, exp.init_state_name, feconf.SUBMIT_HANDLER_NAME, not_default_rule_spec, '1') self.assertEquals(stats_services.get_state_improvements('eid', 1), [])
def test_single_default_rule_hit(self): exp = exp_domain.Exploration.create_default_exploration('eid') exp_services.save_new_exploration('*****@*****.**', exp) state_name = exp.init_state_name event_services.StartExplorationEventHandler.record( 'eid', 1, state_name, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.StateHitEventHandler.record('eid', 1, state_name, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, self.DEFAULT_RULESPEC_STR, '1') ModifiedStatisticsAggregator.start_computation() self.process_and_flush_pending_tasks() with self._get_swap_context(): self.assertEquals(stats_services.get_state_improvements('eid', 1), [{ 'type': 'default', 'rank': 1, 'state_name': exp.init_state_name }])
def test_single_default_rule_hit(self): exp = exp_domain.Exploration.create_default_exploration('eid') exp_services.save_new_exploration('*****@*****.**', exp) state_name = exp.init_state_name event_services.StartExplorationEventHandler.record( 'eid', 1, state_name, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.StateHitEventHandler.record( 'eid', 1, state_name, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, state_name, self.DEFAULT_RULESPEC_STR, '1') ModifiedStatisticsAggregator.start_computation() self.process_and_flush_pending_tasks() with self._get_swap_context(): self.assertEquals( stats_services.get_state_improvements('eid', 1), [{ 'type': 'default', 'rank': 1, 'state_name': exp.init_state_name }])
def test_no_improvement_flag_hit(self): exp = exp_domain.Exploration.create_default_exploration( 'eid', 'A title', 'A category') exp_services.save_new_exploration('*****@*****.**', exp) not_default_rule_spec = exp_domain.RuleSpec({ 'rule_type': rule_domain.ATOMIC_RULE_TYPE, 'name': 'NotDefault', 'inputs': {}, 'subject': 'answer' }, exp.init_state_name, [], [], 'NormalizedString') default_rule_spec = exp_domain.RuleSpec.get_default_rule_spec( feconf.END_DEST, 'NormalizedString') exp.init_state.widget.handlers[0].rule_specs = [ not_default_rule_spec, default_rule_spec ] exp_services._save_exploration('*****@*****.**', exp, '', []) event_services.StateHitEventHandler.record( 'eid', exp.init_state_name, True) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, exp.init_state_name, self.SUBMIT_HANDLER, not_default_rule_spec, '1') self.assertEquals(stats_services.get_state_improvements('eid'), [])
def test_two_state_default_hit(self): self.save_new_default_exploration('eid', '*****@*****.**') exp = exp_services.get_exploration_by_id('eid') FIRST_STATE_NAME = exp.init_state_name SECOND_STATE_NAME = 'State 2' exp_services.update_exploration('*****@*****.**', 'eid', [{ 'cmd': 'edit_state_property', 'state_name': FIRST_STATE_NAME, 'property_name': 'widget_id', 'new_value': 'TextInput', }, { 'cmd': 'add_state', 'state_name': SECOND_STATE_NAME, }, { 'cmd': 'edit_state_property', 'state_name': SECOND_STATE_NAME, 'property_name': 'widget_id', 'new_value': 'TextInput', }], 'Add new state') # Hit the default rule of state 1 once, and the default rule of state 2 # twice. Note that both rules are self-loops. event_services.StartExplorationEventHandler.record( 'eid', 1, FIRST_STATE_NAME, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.StateHitEventHandler.record( 'eid', 1, FIRST_STATE_NAME, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, FIRST_STATE_NAME, self.DEFAULT_RULESPEC_STR, '1') for i in range(2): event_services.StateHitEventHandler.record( 'eid', 1, SECOND_STATE_NAME, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, SECOND_STATE_NAME, self.DEFAULT_RULESPEC_STR, '1') ModifiedStatisticsAggregator.start_computation() self.process_and_flush_pending_tasks() with self.swap(stats_jobs.StatisticsAggregator, 'get_statistics', ModifiedStatisticsAggregator.get_statistics): states = stats_services.get_state_improvements('eid', 1) self.assertEquals(states, [{ 'rank': 2, 'type': 'default', 'state_name': SECOND_STATE_NAME }, { 'rank': 1, 'type': 'default', 'state_name': FIRST_STATE_NAME }]) # Hit the default rule of state 1 two more times. for i in range(2): event_services.StateHitEventHandler.record( 'eid', 1, FIRST_STATE_NAME, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, FIRST_STATE_NAME, self.DEFAULT_RULESPEC_STR, '1') with self.swap(stats_jobs.StatisticsAggregator, 'get_statistics', ModifiedStatisticsAggregator.get_statistics): states = stats_services.get_state_improvements('eid', 1) self.assertEquals(states, [{ 'rank': 3, 'type': 'default', 'state_name': FIRST_STATE_NAME }, { 'rank': 2, 'type': 'default', 'state_name': SECOND_STATE_NAME }])
def test_two_state_default_hit(self): self.save_new_default_exploration('eid', '*****@*****.**') exp = exp_services.get_exploration_by_id('eid') FIRST_STATE_NAME = exp.init_state_name SECOND_STATE_NAME = 'State 2' exp_services.update_exploration('*****@*****.**', 'eid', [{ 'cmd': 'edit_state_property', 'state_name': FIRST_STATE_NAME, 'property_name': 'widget_id', 'new_value': 'TextInput', }, { 'cmd': 'add_state', 'state_name': SECOND_STATE_NAME, }, { 'cmd': 'edit_state_property', 'state_name': SECOND_STATE_NAME, 'property_name': 'widget_id', 'new_value': 'TextInput', }], 'Add new state') # Hit the default rule of state 1 once, and the default rule of state 2 # twice. Note that both rules are self-loops. event_services.StartExplorationEventHandler.record( 'eid', 1, FIRST_STATE_NAME, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.StateHitEventHandler.record('eid', 1, FIRST_STATE_NAME, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, FIRST_STATE_NAME, self.DEFAULT_RULESPEC_STR, '1') for i in range(2): event_services.StateHitEventHandler.record('eid', 1, SECOND_STATE_NAME, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, SECOND_STATE_NAME, self.DEFAULT_RULESPEC_STR, '1') ModifiedStatisticsAggregator.start_computation() self.process_and_flush_pending_tasks() with self.swap(stats_jobs_continuous.StatisticsAggregator, 'get_statistics', ModifiedStatisticsAggregator.get_statistics): states = stats_services.get_state_improvements('eid', 1) self.assertEquals(states, [{ 'rank': 2, 'type': 'default', 'state_name': SECOND_STATE_NAME }, { 'rank': 1, 'type': 'default', 'state_name': FIRST_STATE_NAME }]) # Hit the default rule of state 1 two more times. for i in range(2): event_services.StateHitEventHandler.record('eid', 1, FIRST_STATE_NAME, 'session_id', {}, feconf.PLAY_TYPE_NORMAL) event_services.AnswerSubmissionEventHandler.record( 'eid', 1, FIRST_STATE_NAME, self.DEFAULT_RULESPEC_STR, '1') with self.swap(stats_jobs_continuous.StatisticsAggregator, 'get_statistics', ModifiedStatisticsAggregator.get_statistics): states = stats_services.get_state_improvements('eid', 1) self.assertEquals(states, [{ 'rank': 3, 'type': 'default', 'state_name': FIRST_STATE_NAME }, { 'rank': 2, 'type': 'default', 'state_name': SECOND_STATE_NAME }])