1+ import pytest
2+ from utils .db_utils import execute_query
3+ from utils .file_utils import load_query
4+ from config .db_config import connect_to_db
5+
6+ engine = connect_to_db ()
7+
8+ class TestLolEsports :
9+ def test_tabela_existe (self ):
10+ query = load_query ('check_table_exists' )
11+ df = execute_query (engine , query )
12+ assert df ['table_exists' ][0 ], 'Tabela "2024_lol_esports" não existe!'
13+
14+ def test_colunas_existem (self ):
15+ expected_columns = [
16+ 'gameid' , 'datacompleteness' , 'url' , 'league' , 'year' , 'split' , 'playoffs' , 'date' , 'game' , 'patch' , 'participantid' ,
17+ 'side' , 'position' , 'playername' , 'playerid' , 'teamname' , 'teamid' , 'champion' , 'ban1' , 'ban2' , 'ban3' , 'ban4' , 'ban5' ,
18+ 'pick1' , 'pick2' , 'pick3' , 'pick4' , 'pick5' , 'gamelength' , 'result' , 'kills' , 'deaths' , 'assists' , 'teamkills' ,
19+ 'teamdeaths' , 'doublekills' , 'triplekills' , 'quadrakills' , 'pentakills' , 'firstblood' , 'firstbloodkill' ,
20+ 'firstbloodassist' , 'firstbloodvictim' , 'team kpm' , 'ckpm' , 'firstdragon' , 'dragons' , 'opp_dragons' , 'elementaldrakes' ,
21+ 'opp_elementaldrakes' , 'infernals' , 'mountains' , 'clouds' , 'oceans' , 'chemtechs' , 'hextechs' , 'dragons (type unknown)' ,
22+ 'elders' , 'opp_elders' , 'firstherald' , 'heralds' , 'opp_heralds' , 'void_grubs' , 'opp_void_grubs' , 'firstbaron' , 'barons' ,
23+ 'opp_barons' , 'firsttower' , 'towers' , 'opp_towers' , 'firstmidtower' , 'firsttothreetowers' , 'turretplates' ,
24+ 'opp_turretplates' , 'inhibitors' , 'opp_inhibitors' , 'damagetochampions' , 'dpm' , 'damageshare' , 'damagetakenperminute' ,
25+ 'damagemitigatedperminute' , 'wardsplaced' , 'wpm' , 'wardskilled' , 'wcpm' , 'controlwardsbought' , 'visionscore' , 'vspm' ,
26+ 'totalgold' , 'earnedgold' , 'earned gpm' , 'earnedgoldshare' , 'goldspent' , 'gspd' , 'gpr' , 'total cs' , 'minionkills' ,
27+ 'monsterkills' , 'monsterkillsownjungle' , 'monsterkillsenemyjungle' , 'cspm' , 'goldat10' , 'xpat10' , 'csat10' , 'opp_goldat10' ,
28+ 'opp_xpat10' , 'opp_csat10' , 'golddiffat10' , 'xpdiffat10' , 'csdiffat10' , 'killsat10' , 'assistsat10' , 'deathsat10' ,
29+ 'opp_killsat10' , 'opp_assistsat10' , 'opp_deathsat10' , 'goldat15' , 'xpat15' , 'csat15' , 'opp_goldat15' , 'opp_xpat15' ,
30+ 'opp_csat15' , 'golddiffat15' , 'xpdiffat15' , 'csdiffat15' , 'killsat15' , 'assistsat15' , 'deathsat15' , 'opp_killsat15' ,
31+ 'opp_assistsat15' , 'opp_deathsat15' , 'goldat20' , 'xpat20' , 'csat20' , 'opp_goldat20' , 'opp_xpat20' , 'opp_csat20' ,
32+ 'golddiffat20' , 'xpdiffat20' , 'csdiffat20' , 'killsat20' , 'assistsat20' , 'deathsat20' , 'opp_killsat20' , 'opp_assistsat20' ,
33+ 'opp_deathsat20' , 'goldat25' , 'xpat25' , 'csat25' , 'opp_goldat25' , 'opp_xpat25' , 'opp_csat25' , 'golddiffat25' , 'xpdiffat25' ,
34+ 'csdiffat25' , 'killsat25' , 'assistsat25' , 'deathsat25' , 'opp_killsat25' , 'opp_assistsat25' , 'opp_deathsat25'
35+ ]
36+ query = load_query ('check_columns_exist' )
37+ df = execute_query (engine , query )['column_name' ].tolist ()
38+ missing = set (expected_columns ) - set (df )
39+ assert not missing , f'Colunas ausentes: { missing } '
40+
41+ def test_campos_obrigatorios_nao_nulos (self ):
42+ required_columns = ['gameid' , 'league' , 'year' , 'playername' , 'teamname' , 'champion' ]
43+ for col in required_columns :
44+ query = load_query ('check_no_nulls_in_required_columns' ).replace ('{{column_name}}' , col )
45+ df = execute_query (engine , query )
46+ assert df ['null_count' ][0 ] == 0 , f'Coluna { col } contém valores nulos!'
47+
48+ def test_valores_nao_negativos (self ):
49+ query = load_query ('check_no_negative_values' )
50+ df = execute_query (engine , query )
51+ assert df ['negative_count' ][0 ] == 0 , 'Existem valores negativos em métricas!'
52+
53+ def test_times_vitoriosos (self ):
54+ query = load_query ('count_victorious_teams' )
55+ df = execute_query (engine , query )
56+ assert df ['victorious_teams' ][0 ] > 0 , 'Nenhum time registrado como vencedor!'
57+
58+ def test_numero_jogadores_unicos (self ):
59+ query = load_query ('count_unique_players' )
60+ df = execute_query (engine , query )
61+ assert df ['unique_players' ][0 ] > 0 , 'Não há jogadores únicos na tabela!'
62+
63+ def test_campeoes_mais_jogados (self ):
64+ query = load_query ('most_played_champions' )
65+ df = execute_query (engine , query )
66+ assert not df .empty , 'Não há campeões registrados como mais jogados!'
67+
68+ def test_campeoes_nao_repetidos_em_uma_partida (self ):
69+ query = load_query ('unique_champions_per_game' )
70+ df = execute_query (engine , query )
71+ assert df ['repeated_champions' ].empty , 'Há campeões repetidos em partidas!'
72+
73+ def test_time_com_maior_media_de_kills (self ):
74+ query = load_query ('team_highest_avg_kills' )
75+ df = execute_query (engine , query )
76+ assert not df .empty , 'Nenhum time encontrado com maior média de kills!'
77+
78+ def test_duracao_media_de_jogos (self ):
79+ query = load_query ('average_game_length' )
80+ df = execute_query (engine , query )
81+ assert df ['average_length' ][0 ] > 0 , 'A duração média dos jogos é inválida!'
82+
83+ def test_jogadores_com_mais_de_uma_pentakill (self ):
84+ query = load_query ('players_multiple_pentakills' )
85+ df = execute_query (engine , query )
86+ assert not df .empty , 'Nenhum jogador possui múltiplas pentakills registradas!'
87+
88+ def test_primeiro_sangue_registrado (self ):
89+ query = load_query ('games_with_first_blood' )
90+ df = execute_query (engine , query )
91+ assert df ['games_with_first_blood' ][0 ] > 0 , 'Nenhuma partida possui First Blood registrado!'
92+
93+ def test_vitorias_por_lado (self ):
94+ query = load_query ('victories_by_side' )
95+ df = execute_query (engine , query )
96+ assert df ['blue_wins' ][0 ] > 0 and df ['red_wins' ][0 ] > 0 , 'Não há registro de vitórias para ambos os lados!'
0 commit comments