import unittest
import mock
import context
from steam_review_scraper import steam, db_common
import json
import datetime
class SteamGameInfoTest(unittest.TestCase):
def setUp(self):
self.appid = 000000
json_data = json.dumps({
self.appid : {"data" : {"name" : "Test App", "steam_appid" : self.appid}}
})
self.app_mock = mock.Mock()
self.app_mock.getcode.return_value = 200
self.app_mock.read.return_value = json_data
@mock.patch("urllib.urlopen")
def test_get_game_info(self, urlopen_mock):
check_dict = {"name" : "Test App", "steam_appid" : self.appid}
self.app_mock.getcode.return_value = 200
urlopen_mock.return_value = self.app_mock
ret_dict = steam.get_steam_game_info(self.appid)
self.assertDictEqual(ret_dict, check_dict)
@mock.patch("urllib.urlopen")
def test_response_code_fail(self, urlopen_mock):
self.app_mock.getcode.return_value = 400
urlopen_mock.return_value = self.app_mock
self.assertRaises(
steam.ConnectionError,
steam.get_steam_game_info,
self.appid
)
class ReviewsFromApiTest(unittest.TestCase):
def setUp(self):
self.appid = 000000
self.data = {
"timestamp_created": 1583849466,
"language": "english",
"author":
{"steamid": "76561198366048868",
"playtime_forever": 471,
"last_played": 1583984022,
"num_reviews": 1,
"num_games_owned": 8,
"playtime_last_two_weeks": 471
},
"review": "Great game!!",
"comment_count": 0,
"received_for_free": False,
"voted_up": True,
"recommendationid": "64812883",
"weighted_vote_score": 0,
"votes_up": 0,
"steam_purchase": True,
"timestamp_updated": 1583849466,
"written_during_early_access": False,
"votes_funny": 0
}
self.review_mock = mock.Mock()
self.review_mock.getcode.return_value = 200
@mock.patch("urllib.urlopen")
def test_review_count(self, urlopen_mock):
review_count = 5
reviews = [self.data for _ in range(review_count)]
self.review_mock.read.return_value = json.dumps(
{
"reviews": reviews,
"cursor": "*",
"query_summary": {"total_reviews": review_count}
})
urlopen_mock.return_value = self.review_mock
result = steam.get_reviews_from_api(self.appid)
self.assertEqual(len(result[0]), review_count)
@mock.patch("urllib.urlopen")
def test_response_code_fail(self, urlopen_mock):
reviews = [self.data]
review_count = len(reviews)
self.review_mock.getcode.return_value = 400
self.review_mock.read.return_value = json.dumps(
{
"reviews": reviews,
"cursor": "*",
"query_summary": {"total_reviews": review_count}
})
urlopen_mock.return_value = self.review_mock
self.assertRaises(
steam.ConnectionError,
steam.get_reviews_from_api,
self.appid
)
@mock.patch("urllib.urlopen")
def test_review_content(self, urlopen_mock):
reviews = [self.data]
self.review_mock.read.return_value = json.dumps(
{
"reviews": reviews,
"cursor": "*",
"query_summary": {"total_reviews": len(reviews)}
})
urlopen_mock.return_value = self.review_mock
result = steam.get_reviews_from_api(self.appid)
steam_review = result[0][0]
self.assertEqual(steam_review.user_name, self.data["author"]["steamid"])
self.assertEqual(steam_review.helpful_amount, self.data["votes_up"])
self.assertEqual(
steam_review.date_updated,
datetime.datetime.fromtimestamp(self.data["timestamp_updated"])
)
@mock.patch("urllib.urlopen")
def test_language_filtered(self, urlopen_mock):
reviews = [self.data]
self.review_mock.read.return_value = json.dumps(
{
"reviews": reviews,
"cursor": "*",
"query_summary": {"total_reviews": len(reviews)}
})
urlopen_mock.return_value = self.review_mock
result = steam.get_reviews_from_api(self.appid, languages=["french"])
self.assertIsNotNone(result[0])
self.assertFalse(result[0])
class RemoveDeletedReviewsTest(unittest.TestCase):
def setUp(self):
self.appid = 000000
self.test_conn = db_common.create_database(":memory:")
self.insertDummyData()
def insertDummyData(self):
columns = [
"id",
"recommended",
"review_url",
"date_posted",
"steam_appid",
"lang_key",
"entry_updated"
]
item1 = (1, True, "", 10, self.appid, "english", 5)
item2 = (2, False, "", 10, self.appid, "french", 9)
item3 = (3, True, "", 10, self.appid, "english", 10)
item4 = (4, True, "", 10, 200000, "english", 15)
data = [item1, item2, item3, item4]
self.test_conn.executemany(
"INSERT INTO {0} ({1}) VALUES ({2})".format(
db_common.db_definition.TABLE_STEAM_REVIEWS,
", ".join(columns),
", ".join(["?"] * len(columns)),
), data)
def get_db_count(self):
return db_common.get_review_count(self.appid)
@mock.patch("sqlite3.connect")
def test_delete_single(self, conn_mock):
conn_mock.return_value = self.test_conn
compare_time = 8
steam.remove_deleted_reviews(self.appid, compare_time)
self.assertEqual(self.get_db_count(), 2)
@mock.patch("sqlite3.connect")
def test_delete_multiple(self, conn_mock):
conn_mock.return_value = self.test_conn
compare_time = 10
steam.remove_deleted_reviews(self.appid, compare_time)
self.assertEqual(self.get_db_count(), 1)
@mock.patch("sqlite3.connect")
def test_delete_none(self, conn_mock):
conn_mock.return_value = self.test_conn
compare_time = 4
steam.remove_deleted_reviews(self.appid, compare_time)
self.assertEqual(self.get_db_count(), 3)
if __name__ == '__main__':
unittest.main()