testing data transformations

This commit is contained in:
Andrei Stoica 2024-01-28 20:29:19 -05:00
parent ce845eb0b2
commit 1b157f2202
6 changed files with 1006 additions and 0 deletions

4
pytest.ini Normal file
View File

@ -0,0 +1,4 @@
[pytest]
pythonpath = .
addopts = --cov=src --cov-report html
norecursedirs = tmp*

3
requirments.txt Normal file
View File

@ -0,0 +1,3 @@
pytest
click
psycopg2

188
src/extract.py Normal file
View File

@ -0,0 +1,188 @@
import psycopg2 as pg
from os import environ as env
from typing import TypeVar
T = TypeVar("T")
U = TypeVar("U")
def connect():
return pg.connect(
dbname=env.get("POSTGRES_DB"),
user=env.get("POSTGRES_USER"),
password=env.get("POSTGRES_PASSWORD"),
host=env.get("POSTGRES_HOST"),
port=env.get("POSTGRES_PORT"),
)
def extract_cols(data: dict, cols: list[str]) -> dict: return {key: data.get(key) for key in cols}
def score_to_text(score: list[int]) -> str:
return "-".join(map(str, score))
# maybe could get columns form db
def cols_from_player_stats(player_stats: dict) -> dict:
cols = [
"id",
"gameId",
"gameFinishedAt",
"steam64Id",
"name",
"preaim",
"reactionTime",
"accuracy",
"accuracyEnemySpotted",
"accuracyHead",
"shotsFiredEnemySpotted",
"shotsFired",
"shotsHitEnemySpotted",
"shotsHitFriend",
"shotsHitFriendHead",
"shotsHitFoe",
"shotsHitFoeHead",
"utilityOnDeathAvg",
"heFoesDamageAvg",
"heFriendsDamageAvg",
"heThrown",
"molotovThrown",
"smokeThrown",
"smokeThrownCT",
"smokeThrownCTGood",
"smokeThrownCTGoodRatio",
"smokeThrownCTFoes",
"counterStrafingShotsAll",
"counterStrafingShotsBad",
"counterStrafingShotsGood",
"counterStrafingShotsGoodRatio",
"flashbangHitFoe",
"flashbangLeadingToKill",
"flashbangHitFoeAvgDuration",
"flashbangHitFriend",
"flashbangThrown",
"flashAssist",
"score",
"initialTeamNumber",
"mvps",
"ctRoundsWon",
"ctRoundsLost",
"tRoundsWon",
"tRoundsLost",
"sprayAccuracy",
"molotovFoesDamageAvg",
"molotovFriendsDamageAvg",
"color",
"totalKills",
"totalDeaths",
"kdRatio",
"multi2k",
"multi3k",
"multi4k",
"multi5k",
"hltvRating",
"hsp",
"roundsSurvived",
"roundsSurvivedPercentage",
"dpr",
"totalAssists",
"totalDamage",
"tradeKillOpportunities",
"tradeKillAttempts",
"tradeKillsSucceeded",
"tradeKillAttemptsPercentage",
"tradeKillsSuccessPercentage",
"tradeKillOpportunitiesPerRound",
"tradedDeathOpportunities",
"tradedDeathAttempts",
"tradedDeathAttemptsPercentage",
"tradedDeathsSucceeded",
"tradedDeathsSuccessPercentage",
"tradedDeathsOpportunitiesPerRound",
"leetifyRating",
"personalPerformanceRating",
"ctLeetifyRating",
"tLeetifyRating",
"leetifyUserId",
"isCollector",
"isProPlan",
"isLeetifyStaff",
]
return extract_cols(player_stats, cols)
def cols_from_profile_game(game: dict) -> dict:
cols = [
"ctLeetifyRating",
"ctLeetifyRatingRounds",
"dataSource",
"elo",
"gameFinishedAt",
"gameId",
"isCs2",
"mapName",
"matchResult",
"scores",
"skillLevel",
"tLeetifyRating",
"tLeetifyRatingRounds",
"deaths",
"hasBannedPlayer",
"kills",
"partySize",
]
return extract_cols(game, cols)
def meta_from_profile(profile: dict) -> dict:
meta = profile.get("meta")
if not meta:
raise Exception("Could not get profile metadata", profile)
cols = [
"name",
"steam64Id",
"isCollector",
"isLeetifyStaff",
"isProPlan",
"leetifyUserId",
"faceitNickname",
]
return extract_cols(meta, cols)
def insert_value(data: dict[T, U], key: T, value: U) -> dict[T, U]:
data[key] = value
return data
def convert_game_scores(game: dict) -> dict:
score = game.get("scores")
if not score:
raise Exception("Could not get score from prfile game", game)
score = score_to_text(score)
game["scores"] = score
return game
def games_from_profile(profile: dict) -> list:
games = profile.get("games")
if not games and not type(games) == list:
raise Exception("Could not get games from profile", profile)
meta = profile.get("meta")
if not meta:
raise Exception("Could not get profile metadata", profile)
id = meta.get("leetifyUserId")
if not id:
raise Exception("Could not get id from profile metadata", meta, profile)
games = map(cols_from_profile_game, games)
games = map(lambda game: insert_value(game, "leetifyUserId", id), games)
games = map(convert_game_scores, games)
return list(games)

1
src/leetify/__init__.py Normal file
View File

@ -0,0 +1 @@
from .core import *

19
src/leetify/core.py Normal file
View File

@ -0,0 +1,19 @@
import requests
class Leetify:
api_base_url = "https://api.leetify.com/api"
profile_base_url = f"{api_base_url}/profile"
match_base_url = f"{api_base_url}/games"
def __get_page(self, url: str) -> dict:
resp = requests.get(url)
return resp.json()
def get_profile(self, id: str) -> dict:
url = f"{self.profile_base_url}/{id}"
return self.__get_page(url)
def get_match(self, id: str) -> dict:
url = f"{self.match_base_url}/{id}"
return self.__get_page(url)

791
test/test_extract.py Normal file
View File

@ -0,0 +1,791 @@
from src import extract as ex
from pytest import fixture
@fixture
def profile():
return {
"highlights": [
{
"createdAt": "2023-12-10T22:36:26.813Z",
"description": "AK-47 4K on Overpass",
"gameId": "4647ec10-dc9a-4afd-b9e0-144a462970b2",
"id": "7f4fc8a6-6198-47e1-aa96-f455b70b1f04",
"isPinned": True,
"pendingPro": False,
"rankValue": None,
"roundNumber": 20,
"steam64Id": "76561198036388580",
"thumbnailUrl": "https://media.allstar.gg/6269b3881c45be12afd59318/thumbs/657bcaac1a8ab6000d65a27f_thumb.jpg",
"url": "https://allstar.gg/iframe?clip=657bcaac1a8ab6000d65a27f&known=false&platform=L202211&useCase=WC&sid=76561198036388580",
"username": "skaterCS",
},
{
"createdAt": "2023-12-24T02:15:57.052Z",
"description": "AK-47 4K on Vertigo",
"gameId": "5699e90e-ec76-4ed8-99f3-7905315960ae",
"id": "6e3d2aa4-cf57-44b4-8d85-c771a4d4d5b6",
"isPinned": True,
"pendingPro": False,
"rankValue": None,
"roundNumber": 18,
"steam64Id": "76561198036388580",
"thumbnailUrl": "https://media.allstar.gg/6269b3881c45be12afd59318/thumbs/658e3f6d0c66ff000d4e93a3_thumb.jpg",
"url": "https://allstar.gg/iframe?clip=658e3f6d0c66ff000d4e93a3&known=false&platform=L202211&useCase=WC&sid=76561198036388580",
"username": "skaterCS",
},
{
"createdAt": "2023-12-31T23:53:11.150Z",
"description": "4K on Anubis",
"gameId": "2466135e-aae5-4966-a11f-477cceee6499",
"id": "51aac0ff-5140-46ad-8e46-db6d752f99b1",
"isPinned": False,
"pendingPro": False,
"rankValue": None,
"roundNumber": 6,
"steam64Id": "76561198036388580",
"thumbnailUrl": "https://media.allstar.gg/6269b3881c45be12afd59318/thumbs/6597a2d4589d590012898af7_thumb.jpg",
"url": "https://allstar.gg/iframe?clip=6597a2d4589d590012898af7&known=false&platform=L202211&useCase=WC&sid=76561198036388580",
"username": "skaterCS",
},
{
"createdAt": "2024-01-08T00:48:19.753Z",
"description": "AK-47 4K on Inferno",
"gameId": "6691ea4b-4d5d-4ffc-aabd-ac6f2ce291c0",
"id": "e85ca957-e6cb-4d96-9f02-1850af23d5b0",
"isPinned": False,
"pendingPro": False,
"rankValue": None,
"roundNumber": 22,
"steam64Id": "76561198036388580",
"thumbnailUrl": "https://media.allstar.gg/6269b3881c45be12afd59318/thumbs/65a108eba0d42f000c9af008_thumb.jpg",
"url": "https://allstar.gg/iframe?clip=65a108eba0d42f000c9af008&known=false&platform=L202211&useCase=WC&sid=76561198036388580",
"username": "skaterCS",
},
{
"createdAt": "2024-01-13T20:50:07.002Z",
"description": "AK-47 4K on Ancient",
"gameId": "a3f0c4b6-da37-43c4-8679-b6b858ec1600",
"id": "90af8cd2-3224-4bc6-9dc9-d778ed93339c",
"isPinned": False,
"pendingPro": False,
"rankValue": None,
"roundNumber": 10,
"steam64Id": "76561198036388580",
"thumbnailUrl": "https://media.allstar.gg/6269b3881c45be12afd59318/thumbs/65ac1f0b230e6e000dba9cbc_thumb.jpg",
"url": "https://allstar.gg/iframe?clip=65ac1f0b230e6e000dba9cbc&known=false&platform=L202211&useCase=WC&sid=76561198036388580",
"username": "skaterCS",
},
],
"personalBests": [],
"recentGameRatings": {
"aim": 67.72418696226975,
"positioning": 36.31694139929697,
"utility": 51.595349880463615,
"gamesPlayed": 30,
"leetifyRatingRounds": 620,
"clutch": 0.13,
"ctLeetify": -0.0114,
"leetify": -0.0121,
"opening": -0.0598,
"tLeetify": -0.0128,
},
"teammates": [
{
"isCollector": False,
"isProPlan": False,
"leetifyUserId": "5e28e0c9-4b01-4fa3-b568-c9ae56ed8ac1",
"isBanned": False,
"isLeetifyStaff": False,
"matchesPlayedTogether": 32,
"profileUserLeetifyRating": -0.0016909883720930246,
"rank": {
"type": "premier",
"dataSource": "matchmaking",
"skillLevel": 15267,
},
"steam64Id": "76561198228115488",
"steamAvatarUrl": "https://avatars.steamstatic.com/361d26bb315644059663ab9c32479c09bddbcb96_full.jpg",
"steamNickname": "AustinShyd",
"teammateLeetifyRating": 0.013207703488372092,
"winRateTogether": 0.5666666666666667,
},
{
"isCollector": False,
"isProPlan": True,
"leetifyUserId": "8c3a9cb5-faaf-4401-ae9a-72f5e8528651",
"isBanned": False,
"isLeetifyStaff": False,
"matchesPlayedTogether": 21,
"profileUserLeetifyRating": -0.0037864444444444456,
"rank": {"dataSource": "faceit", "skillLevel": 6},
"steam64Id": "76561198376400117",
"steamAvatarUrl": "https://avatars.akamai.steamstatic.com/8e0029277f9fe4f57d9319d6143cbf72df0d717f_full.jpg",
"steamNickname": "TiMe_TrAvLeR87",
"teammateLeetifyRating": -0.002907555555555556,
"winRateTogether": 0.5714285714285714,
},
{
"isCollector": False,
"isProPlan": False,
"leetifyUserId": "163b492d-931d-4021-bdb9-6e6d4f37b2b2",
"isBanned": False,
"isLeetifyStaff": False,
"matchesPlayedTogether": 11,
"profileUserLeetifyRating": 0.01336536964980545,
"rank": {
"type": "premier",
"dataSource": "matchmaking",
"skillLevel": 9135,
},
"steam64Id": "76561198019127603",
"steamAvatarUrl": "https://avatars.steamstatic.com/b93f04b9194fba8980a2dc74947d47d0087ba113_full.jpg",
"steamNickname": "Lit Taco",
"teammateLeetifyRating": -0.02468832684824903,
"winRateTogether": 0.6363636363636364,
},
{
"isCollector": False,
"isProPlan": False,
"leetifyUserId": "a47ba360-5fb1-4b88-b701-31f7c7ae4659",
"isBanned": False,
"isLeetifyStaff": False,
"matchesPlayedTogether": 27,
"profileUserLeetifyRating": 0.014388762214983713,
"rank": {"dataSource": "faceit", "skillLevel": 2},
"steam64Id": "76561197992874735",
"steamAvatarUrl": "https://avatars.steamstatic.com/1982d13a52fa8e8364d681966972a1de70a36c64_full.jpg",
"steamNickname": "Mela",
"teammateLeetifyRating": -0.02852671009771987,
"winRateTogether": 0.5185185185185185,
},
{
"isCollector": False,
"isProPlan": False,
"leetifyUserId": "f6b4342b-3779-4144-9e53-9d4d408a315c",
"isBanned": False,
"isLeetifyStaff": False,
"matchesPlayedTogether": 22,
"profileUserLeetifyRating": 0.013741448692152916,
"rank": {"dataSource": "faceit", "skillLevel": 6},
"steam64Id": "76561199022813257",
"steamAvatarUrl": "https://avatars.steamstatic.com/1ce49c3e9b812ab90ef16d34bfaf60193e7a7489_full.jpg",
"steamNickname": "Sharky",
"teammateLeetifyRating": 0.02733762575452716,
"winRateTogether": 0.5,
},
{
"isCollector": False,
"isProPlan": False,
"leetifyUserId": "95921f4b-e2aa-466a-adce-4b53b220cc2d",
"isBanned": False,
"isLeetifyStaff": False,
"matchesPlayedTogether": 13,
"profileUserLeetifyRating": -0.0076067375886524815,
"rank": {
"type": "premier",
"dataSource": "matchmaking",
"skillLevel": 14568,
},
"steam64Id": "76561199046277694",
"steamAvatarUrl": "https://avatars.akamai.steamstatic.com/ccd7f5b712406dbbfccc544005fd4731a777c5a1_full.jpg",
"steamNickname": "fwdz",
"teammateLeetifyRating": 0.03853794326241135,
"winRateTogether": 0.5,
},
{
"isCollector": False,
"isProPlan": False,
"leetifyUserId": "a3619755-fffa-49a3-8074-03e1de9dc2c1",
"isBanned": True,
"isLeetifyStaff": False,
"matchesPlayedTogether": 43,
"profileUserLeetifyRating": -0.00885761802575107,
"rank": {
"type": "premier",
"dataSource": "matchmaking",
"skillLevel": 10001,
},
"steam64Id": "76561198051811238",
"steamAvatarUrl": "https://avatars.akamai.steamstatic.com/4611b64e6ea807573525239f57e55fc2ccdbedd7_full.jpg",
"steamNickname": "Revolver_FPS",
"teammateLeetifyRating": -0.02219978401727862,
"winRateTogether": 0.5,
},
{
"isCollector": False,
"isProPlan": False,
"leetifyUserId": "70faf9da-07f9-4a24-afe9-fb84be5d7706",
"isBanned": False,
"isLeetifyStaff": False,
"matchesPlayedTogether": 33,
"profileUserLeetifyRating": 0.00413012729844413,
"rank": {
"type": "premier",
"dataSource": "matchmaking",
"skillLevel": 10243,
},
"steam64Id": "76561198174606711",
"steamAvatarUrl": "https://avatars.akamai.steamstatic.com/e903300342a9eba51d920af5b2ea10080f270a42_full.jpg",
"steamNickname": "Mqple",
"teammateLeetifyRating": 0.008475536480686696,
"winRateTogether": 0.48484848484848486,
},
{
"isCollector": False,
"isProPlan": False,
"isBanned": False,
"isLeetifyStaff": False,
"matchesPlayedTogether": 11,
"profileUserLeetifyRating": -0.01507543859649123,
"rank": {"dataSource": "faceit", "skillLevel": 5},
"steam64Id": "76561198216410960",
"steamAvatarUrl": "https://avatars.akamai.steamstatic.com/2e601d5cd472b63f3b5235364d55e2f6b99ec326_full.jpg",
"steamNickname": "Yaw",
"teammateLeetifyRating": 0.02286578947368421,
"winRateTogether": 0.5454545454545454,
},
],
"games": [
{
"enemyTeamSteam64Ids": [
"76561198017884049",
"76561198376400117",
"76561198097337225",
"76561198801253208",
"76561198883031817",
],
"isCompletedLongMatch": False,
"ownTeamSteam64Ids": [
"76561198060167512",
"76561198036388580",
"76561198048048148",
"76561198246440596",
"76561198108997204",
],
"ownTeamTotalLeetifyRatingRounds": {
"76561198060167512": 23,
"76561198036388580": 23,
"76561198048048148": 23,
"76561198246440596": 23,
"76561198108997204": 23,
},
"ownTeamTotalLeetifyRatings": {
"76561198060167512": 0.0473,
"76561198036388580": 0.0773,
"76561198048048148": -0.0426,
"76561198246440596": -0.0048,
"76561198108997204": -0.0049,
},
"ctLeetifyRating": -0.0157,
"ctLeetifyRatingRounds": 12,
"dataSource": "faceit",
"elo": 1273,
"gameFinishedAt": "2024-01-13T20:45:53.000Z",
"gameId": "a3f0c4b6-da37-43c4-8679-b6b858ec1600",
"isCs2": True,
"mapName": "de_ancient",
"matchResult": "win",
"rankType": None,
"scores": [13, 10],
"skillLevel": 6,
"tLeetifyRating": 0.1625,
"tLeetifyRatingRounds": 11,
"deaths": 11,
"hasBannedPlayer": False,
"kills": 19,
"partySize": 1,
},
{
"enemyTeamSteam64Ids": [
"76561198052273476",
"76561199145898951",
"76561199239125525",
"76561198086636793",
"76561199009125853",
],
"isCompletedLongMatch": False,
"ownTeamSteam64Ids": [
"76561198036388580",
"76561198123663481",
"76561198212556913",
"76561198282254268",
"76561198218979692",
],
"ownTeamTotalLeetifyRatingRounds": {
"76561198036388580": 18,
"76561198123663481": 18,
"76561198212556913": 18,
"76561198282254268": 18,
"76561198218979692": 18,
},
"ownTeamTotalLeetifyRatings": {
"76561198036388580": 0.0138,
"76561198123663481": 0.0004,
"76561198212556913": -0.0143,
"76561198282254268": 0.0516,
"76561198218979692": 0.1367,
},
"ctLeetifyRating": -0.015,
"ctLeetifyRatingRounds": 6,
"dataSource": "faceit",
"elo": 1248,
"gameFinishedAt": "2024-01-13T00:51:26.000Z",
"gameId": "ba78c2f5-99b8-4d4d-afbd-cacee7894dbb",
"isCs2": True,
"mapName": "de_vertigo",
"matchResult": "win",
"rankType": None,
"scores": [13, 5],
"skillLevel": 6,
"tLeetifyRating": 0.0715,
"tLeetifyRatingRounds": 12,
"deaths": 12,
"hasBannedPlayer": False,
"kills": 13,
"partySize": 1,
},
{
"enemyTeamSteam64Ids": [
"76561198180054591",
"76561198103217250",
"76561198255756012",
"76561199228602800",
"76561198131413139",
],
"isCompletedLongMatch": False,
"ownTeamSteam64Ids": [
"76561198799389823",
"76561198068730110",
"76561198086636793",
"76561199145898951",
"76561198036388580",
],
"ownTeamTotalLeetifyRatingRounds": {
"76561198799389823": 24,
"76561198068730110": 24,
"76561198086636793": 24,
"76561199145898951": 24,
"76561198036388580": 24,
},
"ownTeamTotalLeetifyRatings": {
"76561198799389823": -0.0014,
"76561198068730110": 0.0375,
"76561198086636793": -0.0134,
"76561199145898951": -0.0543,
"76561198036388580": -0.0161,
},
"ctLeetifyRating": 0.0091,
"ctLeetifyRatingRounds": 12,
"dataSource": "faceit",
"elo": 1273,
"gameFinishedAt": "2024-01-13T00:11:36.000Z",
"gameId": "f57fc165-8d9d-4cbb-aeaf-3305bf96f6b1",
"isCs2": True,
"mapName": "de_anubis",
"matchResult": "loss",
"rankType": None,
"scores": [11, 13],
"skillLevel": 6,
"tLeetifyRating": -0.0413,
"tLeetifyRatingRounds": 12,
"deaths": 17,
"hasBannedPlayer": False,
"kills": 12,
"partySize": 1,
},
{
"enemyTeamSteam64Ids": [
"76561199065317871",
"76561199133043212",
"76561199237862815",
"76561197979349420",
"76561199568936482",
],
"isCompletedLongMatch": False,
"ownTeamSteam64Ids": [
"76561197991931943",
"76561198174606711",
"76561199057228627",
"76561198075880354",
"76561198036388580",
],
"ownTeamTotalLeetifyRatingRounds": {
"76561197991931943": 20,
"76561198174606711": 20,
"76561199057228627": 20,
"76561198075880354": 20,
"76561198036388580": 20,
},
"ownTeamTotalLeetifyRatings": {
"76561197991931943": -0.062,
"76561198174606711": 0.0301,
"76561199057228627": 0.0457,
"76561198075880354": 0.0723,
"76561198036388580": 0.0185,
},
"ctLeetifyRating": 0.0273,
"ctLeetifyRatingRounds": 8,
"dataSource": "faceit",
"elo": 962,
"gameFinishedAt": "2023-11-12T19:53:56.000Z",
"gameId": "76bd9c1b-4350-4cba-a85c-853dda2319a3",
"isCs2": True,
"mapName": "de_vertigo",
"matchResult": "win",
"rankType": None,
"scores": [13, 7],
"skillLevel": 4,
"tLeetifyRating": 0.0053,
"tLeetifyRatingRounds": 12,
},
{
"enemyTeamSteam64Ids": [
"76561199215625191",
"76561198138569488",
"76561198882489909",
"76561198967893666",
"76561199480114036",
],
"isCompletedLongMatch": True,
"ownTeamSteam64Ids": [
"76561198232726872",
"76561198174606711",
"76561198036388580",
"76561198051811238",
"76561198060380124",
],
"ownTeamTotalLeetifyRatingRounds": {
"76561198232726872": 41,
"76561198174606711": 41,
"76561198036388580": 41,
"76561198051811238": 41,
"76561198060380124": 41,
},
"ownTeamTotalLeetifyRatings": {
"76561198232726872": 0.0271,
"76561198174606711": 0.0056,
"76561198036388580": 0.0273,
"76561198051811238": -0.0392,
"76561198060380124": -0.0188,
},
"ctLeetifyRating": 0.0493,
"ctLeetifyRatingRounds": 21,
"dataSource": "faceit",
"elo": 910,
"gameFinishedAt": "2023-11-11T03:35:16.000Z",
"gameId": "fdd3867f-225b-4177-bc99-661a7fa43c41",
"isCs2": True,
"mapName": "de_vertigo",
"matchResult": "win",
"rankType": None,
"scores": [22, 19],
"skillLevel": 4,
"tLeetifyRating": 0.0063,
"tLeetifyRatingRounds": 20,
},
{
"enemyTeamSteam64Ids": [
"76561198954974027",
"76561198340039100",
"76561198267258925",
"76561198132032289",
"76561198268422115",
],
"isCompletedLongMatch": False,
"ownTeamSteam64Ids": [
"76561197962906363",
"76561197971574216",
"76561198036388580",
"76561198174606711",
"76561198142815385",
],
"ownTeamTotalLeetifyRatingRounds": {
"76561197962906363": 23,
"76561197971574216": 23,
"76561198036388580": 23,
"76561198174606711": 23,
"76561198142815385": 23,
},
"ownTeamTotalLeetifyRatings": {
"76561197962906363": -0.0855,
"76561197971574216": -0.004,
"76561198036388580": 0.0142,
"76561198174606711": 0.0311,
"76561198142815385": -0.039,
},
"ctLeetifyRating": 0.0069,
"ctLeetifyRatingRounds": 12,
"dataSource": "faceit",
"elo": 960,
"gameFinishedAt": "2023-11-10T01:02:34.000Z",
"gameId": "73acee05-c6ce-4a15-9ab1-c4201443d6ff",
"isCs2": True,
"mapName": "de_mirage",
"matchResult": "loss",
"rankType": None,
"scores": [10, 13],
"skillLevel": 4,
"tLeetifyRating": 0.0209,
"tLeetifyRatingRounds": 11,
},
],
"meta": {
"name": "Skater",
"steam64Id": "76561198036388580",
"steamAvatarUrl": "https://avatars.akamai.steamstatic.com/ee0e6adb9c075b0b40cbedba2f8699d1c040ca6c_full.jpg",
"isCollector": False,
"isLeetifyStaff": False,
"isProPlan": False,
"leetifyUserId": "6c53f87a-5877-4dd3-ab8f-527119ce4939",
"faceitNickname": "skaterCS",
"platformBans": [],
},
}
@fixture
def games(profile):
return profile["games"]
def test_extract_cols(profile):
empty_dict = {}
cols = ["meta"]
res = ex.extract_cols(empty_dict, [])
assert res == {}
res = ex.extract_cols(empty_dict, cols)
assert res == {"meta": None}
res = ex.extract_cols(profile, [])
assert res == {}
res = ex.extract_cols(profile, cols)
assert res == {
"meta": {
"name": "Skater",
"steam64Id": "76561198036388580",
"steamAvatarUrl": "https://avatars.akamai.steamstatic.com/ee0e6adb9c075b0b40cbedba2f8699d1c040ca6c_full.jpg",
"isCollector": False,
"isLeetifyStaff": False,
"isProPlan": False,
"leetifyUserId": "6c53f87a-5877-4dd3-ab8f-527119ce4939",
"faceitNickname": "skaterCS",
"platformBans": [],
},
}
cols.append("recentGameRatings")
res = ex.extract_cols(profile, cols)
assert res == {
"meta": {
"name": "Skater",
"steam64Id": "76561198036388580",
"steamAvatarUrl": "https://avatars.akamai.steamstatic.com/ee0e6adb9c075b0b40cbedba2f8699d1c040ca6c_full.jpg",
"isCollector": False,
"isLeetifyStaff": False,
"isProPlan": False,
"leetifyUserId": "6c53f87a-5877-4dd3-ab8f-527119ce4939",
"faceitNickname": "skaterCS",
"platformBans": [],
},
"recentGameRatings": {
"aim": 67.72418696226975,
"positioning": 36.31694139929697,
"utility": 51.595349880463615,
"gamesPlayed": 30,
"leetifyRatingRounds": 620,
"clutch": 0.13,
"ctLeetify": -0.0114,
"leetify": -0.0121,
"opening": -0.0598,
"tLeetify": -0.0128,
},
}
def test_score_to_text():
text = ex.score_to_text([])
assert text == ""
text = ex.score_to_text([1])
assert text == "1"
text = ex.score_to_text([1, 2])
assert text == "1-2"
text = ex.score_to_text([1, 2, 3])
assert text == "1-2-3"
def test_meta_from_profile(profile):
res = ex.meta_from_profile(profile)
assert res == {
"name": "Skater",
"steam64Id": "76561198036388580",
"isCollector": False,
"isLeetifyStaff": False,
"isProPlan": False,
"leetifyUserId": "6c53f87a-5877-4dd3-ab8f-527119ce4939",
"faceitNickname": "skaterCS",
}
def test_games_from_profile(profile):
games = profile["games"].copy()
profile["games"] = []
res = ex.games_from_profile(profile)
assert res == []
profile["games"] = games[:1]
res = ex.games_from_profile(profile)
assert res == [
{
"ctLeetifyRating": -0.0157,
"ctLeetifyRatingRounds": 12,
"dataSource": "faceit",
"elo": 1273,
"gameFinishedAt": "2024-01-13T20:45:53.000Z",
"gameId": "a3f0c4b6-da37-43c4-8679-b6b858ec1600",
"isCs2": True,
"mapName": "de_ancient",
"matchResult": "win",
"scores": "13-10",
"skillLevel": 6,
"tLeetifyRating": 0.1625,
"tLeetifyRatingRounds": 11,
"deaths": 11,
"hasBannedPlayer": False,
"kills": 19,
"partySize": 1,
"leetifyUserId": "6c53f87a-5877-4dd3-ab8f-527119ce4939",
}
]
profile["games"] = games
res = ex.games_from_profile(profile)
assert res == [
{
"ctLeetifyRating": -0.0157,
"ctLeetifyRatingRounds": 12,
"dataSource": "faceit",
"elo": 1273,
"gameFinishedAt": "2024-01-13T20:45:53.000Z",
"gameId": "a3f0c4b6-da37-43c4-8679-b6b858ec1600",
"isCs2": True,
"mapName": "de_ancient",
"matchResult": "win",
"scores": "13-10",
"skillLevel": 6,
"tLeetifyRating": 0.1625,
"tLeetifyRatingRounds": 11,
"deaths": 11,
"hasBannedPlayer": False,
"kills": 19,
"partySize": 1,
"leetifyUserId": "6c53f87a-5877-4dd3-ab8f-527119ce4939",
},
{
"ctLeetifyRating": -0.015,
"ctLeetifyRatingRounds": 6,
"dataSource": "faceit",
"elo": 1248,
"gameFinishedAt": "2024-01-13T00:51:26.000Z",
"gameId": "ba78c2f5-99b8-4d4d-afbd-cacee7894dbb",
"isCs2": True,
"mapName": "de_vertigo",
"matchResult": "win",
"scores": "13-5",
"skillLevel": 6,
"tLeetifyRating": 0.0715,
"tLeetifyRatingRounds": 12,
"deaths": 12,
"hasBannedPlayer": False,
"kills": 13,
"partySize": 1,
"leetifyUserId": "6c53f87a-5877-4dd3-ab8f-527119ce4939",
},
{
"ctLeetifyRating": 0.0091,
"ctLeetifyRatingRounds": 12,
"dataSource": "faceit",
"elo": 1273,
"gameFinishedAt": "2024-01-13T00:11:36.000Z",
"gameId": "f57fc165-8d9d-4cbb-aeaf-3305bf96f6b1",
"isCs2": True,
"mapName": "de_anubis",
"matchResult": "loss",
"scores": "11-13",
"skillLevel": 6,
"tLeetifyRating": -0.0413,
"tLeetifyRatingRounds": 12,
"deaths": 17,
"hasBannedPlayer": False,
"kills": 12,
"partySize": 1,
"leetifyUserId": "6c53f87a-5877-4dd3-ab8f-527119ce4939",
},
{
"ctLeetifyRating": 0.0273,
"ctLeetifyRatingRounds": 8,
"dataSource": "faceit",
"elo": 962,
"gameFinishedAt": "2023-11-12T19:53:56.000Z",
"gameId": "76bd9c1b-4350-4cba-a85c-853dda2319a3",
"isCs2": True,
"mapName": "de_vertigo",
"matchResult": "win",
"scores": "13-7",
"skillLevel": 4,
"tLeetifyRating": 0.0053,
"tLeetifyRatingRounds": 12,
"deaths": None,
"hasBannedPlayer": None,
"kills": None,
"partySize": None,
"leetifyUserId": "6c53f87a-5877-4dd3-ab8f-527119ce4939",
},
{
"ctLeetifyRating": 0.0493,
"ctLeetifyRatingRounds": 21,
"dataSource": "faceit",
"elo": 910,
"gameFinishedAt": "2023-11-11T03:35:16.000Z",
"gameId": "fdd3867f-225b-4177-bc99-661a7fa43c41",
"isCs2": True,
"mapName": "de_vertigo",
"matchResult": "win",
"scores": "22-19",
"skillLevel": 4,
"tLeetifyRating": 0.0063,
"tLeetifyRatingRounds": 20,
"deaths": None,
"hasBannedPlayer": None,
"kills": None,
"partySize": None,
"leetifyUserId": "6c53f87a-5877-4dd3-ab8f-527119ce4939",
},
{
"ctLeetifyRating": 0.0069,
"ctLeetifyRatingRounds": 12,
"dataSource": "faceit",
"elo": 960,
"gameFinishedAt": "2023-11-10T01:02:34.000Z",
"gameId": "73acee05-c6ce-4a15-9ab1-c4201443d6ff",
"isCs2": True,
"mapName": "de_mirage",
"matchResult": "loss",
"scores": "10-13",
"skillLevel": 4,
"tLeetifyRating": 0.0209,
"tLeetifyRatingRounds": 11,
"deaths": None,
"hasBannedPlayer": None,
"kills": None,
"partySize": None,
"leetifyUserId": "6c53f87a-5877-4dd3-ab8f-527119ce4939",
},
]