def test_counters_end_to_end(self): storm_spirit = HeroFactory(name='Storm Spirit') queen_of_pain = HeroFactory(name='Queen of Pain') AdvantageFactory(hero=storm_spirit, enemy=queen_of_pain, advantage=1.75) response = make_request_and_return_text( "what heroes are good against Queen of Pain") assert "Storm Spirit" in response
def test_no_counter_picking(self): storm_spirit = HeroFactory(name='Storm Spirit') queen_of_pain = HeroFactory(name='Queen of Pain') AdvantageFactory(hero=storm_spirit, enemy=queen_of_pain, advantage=1.75) _, token = ResponseGenerator.respond( "What heroes are good against Queen of Pain") _, token = ResponseGenerator.respond('No.', token) assert isinstance(Context.deserialise(token), FreshContext)
def test_strengths_response(self): queen_of_pain = HeroFactory(name='Queen of Pain') storm_spirit = HeroFactory(name='Storm Spirit') AdvantageFactory(hero=queen_of_pain, enemy=storm_spirit, advantage=1.75) response = SingleHeroAdvantagesResponse.respond(queen_of_pain, role=None, user_id=None) assert response == 'Queen of Pain is good against Storm Spirit'
def test_counter_respones(self): queen_of_pain = HeroFactory(name='Queen of Pain') AdvantageFactory( hero=HeroFactory(name='Meepo'), enemy=queen_of_pain, advantage=4.34, ) response = SingleHeroCountersResponse.respond(queen_of_pain, role=None, user_id=None) assert response == 'Meepo is very strong against Queen of Pain'
def test_strengths_role_response(self): queen_of_pain = HeroFactory(name='Queen of Pain') storm_spirit = HeroFactory(name='Storm Spirit', is_support=False) keeper = HeroFactory(name='Keeper of the Light', is_support=True) AdvantageFactory(hero=queen_of_pain, enemy=storm_spirit, advantage=1.75) AdvantageFactory(hero=queen_of_pain, enemy=keeper, advantage=1.52) response = SingleHeroAdvantagesResponse.respond(queen_of_pain, role=HeroRole.SUPPORT, user_id=None) assert response == 'Queen of Pain is good against Keeper of the Light'
def setUpAdvantages(): storm_spirit = HeroFactory(name='Storm Spirit', is_mid=True) queen_of_pain = HeroFactory(name='Queen of Pain', is_mid=True, is_support=False) shadow_fiend = HeroFactory(name='Shadow Fiend', is_mid=True) razor = HeroFactory(name='Razor', is_mid=True) zeus = HeroFactory(name='Zeus', is_mid=True) sniper = HeroFactory(name='Sniper', is_mid=True) disruptor = HeroFactory(name='Disruptor', is_mid=False, is_support=True) meepo = HeroFactory(name='Meepo') AdvantageFactory(hero=queen_of_pain, enemy=storm_spirit, advantage=2.14) AdvantageFactory(hero=sniper, enemy=storm_spirit, advantage=-3.11) AdvantageFactory(hero=shadow_fiend, enemy=storm_spirit, advantage=0.55) AdvantageFactory(hero=razor, enemy=storm_spirit, advantage=0.66) AdvantageFactory(hero=zeus, enemy=storm_spirit, advantage=-4.50) AdvantageFactory(hero=disruptor, enemy=storm_spirit, advantage=1.75) AdvantageFactory(hero=storm_spirit, enemy=queen_of_pain, advantage=-1.75) AdvantageFactory(hero=meepo, enemy=queen_of_pain, advantage=4.34)
def test_abilities_with_the_same_name(self): AbilityFactory( hero=HeroFactory(name='Lion'), name='Hex', cooldown='30/24/18/12', ) AbilityFactory( hero=HeroFactory(name='Shadow Shaman'), name='Hex', cooldown='13', ) response, _ = ResponseGenerator.respond("What's the cooldown of Hex?") assert response == ( "Both Lion and Shadow Shaman have the Hex ability. Lion's cooldown is 13, Shadow " "Shaman's is 30, 24, 18, 12 seconds.")
def test_extreme_strengths_response(self): queen_of_pain = HeroFactory(name='Queen of Pain') AdvantageFactory(hero=queen_of_pain, enemy=HeroFactory(name='Storm Spirit'), advantage=1.75) AdvantageFactory(hero=queen_of_pain, enemy=HeroFactory(name='Clockwerk'), advantage=2.58) response = SingleHeroAdvantagesResponse.respond(queen_of_pain, role=None, user_id=None) assert response == ( 'Queen of Pain is very strong against Clockwerk, and also counters Storm Spirit' )
def test_counter_role_response(self): queen_of_pain = HeroFactory(name='Queen of Pain') AdvantageFactory( hero=HeroFactory(name='Meepo', is_support=False), enemy=queen_of_pain, advantage=4.34, ) AdvantageFactory( hero=HeroFactory(name='Oracle', is_support=True), enemy=queen_of_pain, advantage=1.4, ) response = SingleHeroCountersResponse.respond(queen_of_pain, role=HeroRole.SUPPORT, user_id=None) assert response == "Oracle is good against Queen of Pain"
def test_loads_all_abilities(self): disruptor = HeroFactory(name='Disruptor') self.scraper.load_hero_abilities(disruptor) self.assertEqual(Ability.objects.count(), 4) self.assertTrue( all(ability.hero == disruptor for ability in Ability.objects.all()))
def test_when_no_cooldown(self): ability = AbilityFactory( hero=HeroFactory(name='Pangolier'), name='Swashbuckle', cooldown='', ) response = AbilityCooldownResponse.respond(ability, user_id=None) assert response == "Swashbuckle is a passive ability, with no cooldown"
def test_counter_response_no_matching_hero(self): queen_of_pain = HeroFactory(name='Queen of Pain') response = SingleHeroCountersResponse.respond(queen_of_pain, role=HeroRole.JUNGLER, user_id=None) assert response == ( "Sorry, I don't know of any jungle heroes which counter Queen of Pain" )
def test_basics_end_to_end(self): AbilityFactory( hero=HeroFactory(name='Disruptor'), name='Static Storm', is_ultimate=True, ) response = make_request_and_return_text("what is Disruptor's ultimate") assert "Static Storm" in response
def test_no_ability_list(self): AbilityFactory( name='Glimpse', cooldown='60/46/32/18', hero=HeroFactory(name='Disruptor'), ) _, token = ResponseGenerator.respond("What are Disruptor's abilities?") _, token = ResponseGenerator.respond('No.', token) assert isinstance(Context.deserialise(token), FreshContext)
def test_goodbye(self): AbilityFactory( hero=HeroFactory(name='Disruptor'), name='Static Storm', is_ultimate=True, ) _, token = ResponseGenerator.respond("What is Disruptor's ultimate?") with self.assertRaises(Goodbye): ResponseGenerator.respond("goodbye", token)
def setUp(self): disruptor = HeroFactory(name='Disruptor') AbilityFactory( hero=disruptor, name='Thunder Strike', hotkey='Q', is_ultimate=False, damage_type=DamageType.MAGICAL, ) AbilityFactory( hero=disruptor, name='Glimpse', cooldown='60/46/32/18', description= ('Teleports the target hero back to where it was 4 seconds ago. Instantly kills ' 'illusions.'), hotkey='W', is_ultimate=False, ) AbilityFactory( hero=disruptor, name='Kinetic Field', spell_immunity=SpellImmunity.DOES_NOT_PIERCE, spell_immunity_detail= ("The Barrier's modifier persists if it was placed before spell immunity." ), hotkey='E', is_ultimate=False, ) AbilityFactory( hero=disruptor, name='Static Storm', cooldown='90/80/70', hotkey='R', is_ultimate=True, ) AbilityFactory( hero=HeroFactory(name='Sniper'), name='Assassinate', is_ultimate=True, damage_type=DamageType.MAGICAL, aghanims_damage_type=DamageType.PHYSICAL, )
def test_saying_against_breaks_hero_context(self): storm_spirit = HeroFactory(name='Storm Spirit') AbilityFactory( name='Glimpse', cooldown='60/46/32/18', hero=HeroFactory(name='Disruptor'), ) AbilityFactory( name='Static Remnant', hero=storm_spirit, ) AdvantageFactory( hero=HeroFactory(name='Queen of Pain'), enemy=storm_spirit, advantage=2.14, ) _, token = ResponseGenerator.respond( "Which are Disruptor's abilities?") response, _ = ResponseGenerator.respond( "Who is good against Storm Spirit?", token) assert "Static Remnant" not in response assert "Queen of Pain" in response
def test_feedback(self, feedback_logger): AbilityFactory( name='Glimpse', hero=HeroFactory(name='Disruptor'), ) response, context = ResponseGenerator.respond("Give feedback") assert "Great" in response response, context = ResponseGenerator.respond("I love you", context) assert feedback_logger.info.called_with('I love you') assert "Thank" in response response, context = ResponseGenerator.respond( "What are Disruptor's abilities?", context) assert "Glimpse in response" assert feedback_logger.info.call_count == 1
def test_ability_list_response_excludes_talent_abilities(self): phantom_lancer = HeroFactory(name='Phantom Lancer') AbilityFactory( hero=phantom_lancer, name='Critical Strike', is_from_talent=True, ) AbilityFactory( hero=phantom_lancer, name='Juxtapose', ) response = AbilityListResponse.respond(phantom_lancer, user_id=None) assert 'Juxtapose' in response assert 'Critical Strike' not in response
def test_loads_kinetic_field(self): self.scraper.load_hero_abilities(HeroFactory(name='Disruptor')) kinetic_field = Ability.objects.get(name='Kinetic Field') self.assertEqual( kinetic_field.description, "After a short formation time, creates a circular barrier of kinetic energy that " "enemies can't pass.") self.assertEqual(kinetic_field.cooldown, '13/12/11/10') self.assertEqual(kinetic_field.hotkey, 'E') self.assertFalse(kinetic_field.is_ultimate) self.assertEqual(kinetic_field.spell_immunity, SpellImmunity.DOES_NOT_PIERCE) self.assertEqual(kinetic_field.damage_type, None) self.assertEqual(kinetic_field.aghanims_damage_type, None) self.assertEqual( kinetic_field.spell_immunity_detail, "The Barrier's modifier persists if it was placed before spell immunity." )
def test_changing_context(self): AbilityFactory( hero=HeroFactory(name='Disruptor'), name='Static Storm', cooldown='90/80/70', hotkey='R', is_ultimate=True, ) _, token = ResponseGenerator.respond( 'What is the cooldown of Static Storm?') assert token['context-class'] == 'SingleAbilityContext' assert token['useage-count'] == 1 response, token = ResponseGenerator.respond( "What is Disruptor's ultimate?", token) assert "ultimate" in response assert "Static Storm" in response assert token['context-class'] == 'SingleAbilityContext' assert token['useage-count'] == 1
def test_hero_ultimate_response_multiple_ultimates(self): dark_willow = HeroFactory(name='Dark Willow') AbilityFactory( hero=dark_willow, name='Bedlam', cooldown='40,30,20', is_ultimate=True, ) AbilityFactory( hero=dark_willow, name='Terrorize', cooldown='40,30,20', is_ultimate=True, ) response, context = ResponseGenerator.respond( "What is Dark Willow's ultimate?") assert response == ( "<speak>Dark Willow has multiple ultimates: Bedlam and Terrorize.</speak>" ) assert not context
def test_damage_type_with_aghs(self): self.scraper.load_hero_abilities(HeroFactory(name='Sniper')) assassinate = Ability.objects.get(name='Assassinate') self.assertEqual(assassinate.damage_type, DamageType.MAGICAL) self.assertEqual(assassinate.aghanims_damage_type, DamageType.PHYSICAL)
def test_abilities_with_long_headers(self): self.scraper.load_hero_abilities(HeroFactory(name='Dark Willow')) for ability in Ability.objects.all(): assert len(ability.hotkey) == 1
def test_ignores_second_ability_with_same_hotkey(self): self.scraper.load_hero_abilities(HeroFactory(name='Pangolier')) assert Ability.objects.count() == 4 assert Ability.objects.get(name='Rolling Thunder') with self.assertRaises(Ability.DoesNotExist): assert Ability.objects.get(name='Stop Rolling')
def test_talent_abilities(self): self.scraper.load_hero_abilities(HeroFactory(name='Phantom Lancer')) assert Ability.objects.get(name='Critical Strike').is_from_talent assert Ability.objects.filter(is_from_talent=False).count() == 4
def test_abilities_with_no_cooldown(self): self.scraper.load_hero_abilities(HeroFactory(name='Phantom Lancer')) assert Ability.objects.get(name='Juxtapose').cooldown == ''
def test_loads_ultimate(self): self.scraper.load_hero_abilities(HeroFactory(name='Disruptor')) self.assertTrue(Ability.objects.get(name='Static Storm').is_ultimate)
def test_invoker_hotkeys(self): self.scraper.load_hero_abilities(HeroFactory(name='Invoker')) for a in Ability.objects.all(): assert (not a.hotkey or len(a.hotkey) == 1)
def test_keeper_after_720(self): self.scraper.load_hero_abilities( HeroFactory(name='Keeper of the Light')) illuminate = Ability.objects.get(name='Blinding Light') self.assertEqual(illuminate.damage_type, DamageType.MAGICAL)