def test_DBDelSelect(self): # DB操作をモックに置き換える with patch('DBControlar.sqlite3') as mocksql, freezegun.freeze_time( '2018-11-18 17:12:58'): mocksql.connect().cursor( ).execute.return_value = 'execute sql done' mocksql.connect().commit.return_value = 'commit done' controlar = DBControlar.DBControlar() expect = ( "rowid_sample", ) + controlar._DBControlar__GetDelUpdateParam( self.del_tweet_s) mocksql.connect().cursor().execute.return_value = [expect] t = date.today() - timedelta(1) w = "delete_done = 0 and created_at < '{}'".format( t.strftime('%Y-%m-%d')) expect_select_sql_s = "select * from DeleteTarget where " + w u = "delete_done = 1, deleted_at = '{}'".format( t.strftime('%Y-%m-%d')) expect_update_sql_s = "update DeleteTarget set {} where {}".format( u, w) # DB操作を伴う操作を行う actual = controlar.DBDelSelect() # DB操作が規定の引数で呼び出されたことを確認する mocksql.connect().cursor().execute.assert_any_call( expect_select_sql_s) mocksql.connect().cursor().execute.assert_any_call( expect_update_sql_s) # 取得した値の確認 self.assertEqual(expect, actual[0])
def test_DBRetweetSelect(self): # DB操作をモックに置き換える with patch('DBControlar.sqlite3') as mocksql, freezegun.freeze_time( '2018-11-18 17:12:58'): mocksql.connect().cursor( ).execute.return_value = 'execute sql done' controlar = DBControlar.DBControlar() expect = ("rowid_sample", "is_exist_save_file_flag_sample" ) + controlar._DBControlar__GetUpdateParam( self.img_url_s, self.tweet_s, self.save_file_fullpath_s) mocksql.connect().cursor().execute.return_value = [expect] # DB操作を伴う操作を行う limit_s = 300 actual = controlar.DBRetweetSelect(limit_s) # DB操作が規定の引数で呼び出されたことを確認する retweet_select_sql_s = controlar._DBControlar__GetRetweetSelectSQL( limit_s) mocksql.connect().cursor().execute.assert_called_once_with( retweet_select_sql_s) # 取得した値の確認 self.assertEqual(self.img_url_s + ":orig", actual[0][3]) self.assertEqual(self.tweet_url_s, actual[0][6]) self.assertEqual(expect, actual[0])
def test_DBDelInsert(self): # DB操作をモックに置き換える with patch('DBControlar.sqlite3') as mocksql, freezegun.freeze_time( '2018-11-18 17:12:58'): mocksql.connect().cursor( ).execute.return_value = 'execute sql done' mocksql.connect().commit.return_value = 'commit done' controlar = DBControlar.DBControlar() # DB操作を伴う操作を行う controlar.DBDelInsert(self.del_tweet_s) # DB操作が規定の引数で呼び出されたことを確認する param_s = controlar._DBControlar__GetDelUpdateParam( self.del_tweet_s) mocksql.connect().cursor().execute.assert_called_once_with( controlar._DBControlar__del_sql, param_s)
def test_DBRetweetFlagUpdate(self): # DB操作をモックに置き換える with patch('DBControlar.sqlite3') as mocksql, freezegun.freeze_time( '2018-11-18 17:12:58'): mocksql.connect().cursor( ).execute.return_value = 'execute sql done' mocksql.connect().commit.return_value = 'commit done' controlar = DBControlar.DBControlar() # DB操作を伴う操作を行う controlar.DBRetweetFlagUpdate(self.img_filename_s) # DB操作が規定の引数で呼び出されたことを確認する retweet_flag_update_sql_s = controlar._DBControlar__GetRetweetFlagUpdateSQL( self.img_filename_s) mocksql.connect().cursor().execute.assert_called_once_with( retweet_flag_update_sql_s)
def test_DBRetweetUpsert(self): # DB操作をモックに置き換える with patch('DBControlar.sqlite3') as mocksql, freezegun.freeze_time( '2018-11-18 17:12:58'): mocksql.connect().cursor( ).execute.return_value = 'execute sql done' mocksql.connect().commit.return_value = 'commit done' controlar = DBControlar.DBControlar() # DB操作を伴う操作を行う controlar.DBRetweetUpsert(self.img_url_s, self.tweet_s, self.save_file_fullpath_s) # DB操作が規定の引数で呼び出されたことを確認する param_s = controlar._DBControlar__GetUpdateParam( self.img_url_s, self.tweet_s, self.save_file_fullpath_s) retweet_sql_s = controlar._DBControlar__retweet_sql mocksql.connect().cursor().execute.assert_called_once_with( retweet_sql_s, param_s)
def __init__(self): self.config = configparser.SafeConfigParser() try: self.db_cont = DBControlar.DBControlar() if not self.config.read(self.CONFIG_FILE_NAME, encoding="utf8"): raise IOError config = self.config["twitter_token_keys"] self.TW_CONSUMER_KEY = config["consumer_key"] self.TW_CONSUMER_SECRET = config["consumer_secret"] self.TW_ACCESS_TOKEN_KEY = config["access_token"] self.TW_ACCESS_TOKEN_SECRET = config["access_token_secret"] config = self.config["line_token_keys"] self.LN_TOKEN_KEY = config["token_key"] self.save_retweet_path = os.path.abspath( self.config["save_directory"]["save_retweet_path"]) # count * retweet_get_max_loop だけツイートをさかのぼる。 self.user_name = self.config["tweet_timeline"]["user_name"] self.retweet_get_max_loop = int( self.config["tweet_timeline"]["retweet_get_max_loop"]) self.count = int(self.config["tweet_timeline"]["count"]) except IOError: print(CONFIG_FILE_NAME + " is not exist or cannot be opened.") exit(-1) except KeyError: ex, ms, tb = sys.exc_info() traceback.print_exception(ex, ms, tb) exit(-1) except Exception: ex, ms, tb = sys.exc_info() traceback.print_exception(ex, ms, tb) exit(-1) self.oath = OAuth1Session(self.TW_CONSUMER_KEY, self.TW_CONSUMER_SECRET, self.TW_ACCESS_TOKEN_KEY, self.TW_ACCESS_TOKEN_SECRET) self.max_id = None
</html> ''' th_template = '''<th> <div style="position: relative; width: {pic_width}px;" > <a href="{url}" target="_blank"> <img border="0" src="{url}" alt="{url}" width="{pic_width}px"> </a> <a href="{tweet_url}" target="_blank"> <img src="{pointer_path}" alt="pointer" style="opacity: 0.5; position: absolute; right: 10px; bottom: 10px;" /> </a> </div> </th> ''' POINTER_PATH = './pointer.png' db_cont = DBControlar.DBControlar() def MakeTHTag(url, tweet_url): pic_width = 256 return th_template.format(pic_width=pic_width, url=url, tweet_url=tweet_url, pointer_path=POINTER_PATH) def WriteFavHTML(del_url_list): db = db_cont.DBFavSelect() res = '' COLUMN_NUM = 5
def test_SQLText(self): # 使用するSQL構文をチェックする # 実際にDB操作はしないためモックは省略 controlar = DBControlar.DBControlar() p1 = 'img_filename,url,url_large,' p2 = 'tweet_id,tweet_url,created_at,user_id,user_name,screan_name,tweet_text,' p3 = 'saved_localpath,saved_created_at' pn = '?,?,?,?,?,?,?,?,?,?,?,?' expect = 'replace into Favorite (' + p1 + p2 + p3 + ') values (' + pn + ')' actual = controlar._DBControlar__fav_sql self.assertEqual(expect, actual) p1 = 'img_filename,url,url_large,' p2 = 'tweet_id,tweet_url,created_at,user_id,user_name,screan_name,tweet_text,' p3 = 'saved_localpath,saved_created_at' pn = '?,?,?,?,?,?,?,?,?,?,?,?' expect = 'replace into Retweet (' + p1 + p2 + p3 + ') values (' + pn + ')' actual = controlar._DBControlar__retweet_sql self.assertEqual(expect, actual) p1 = 'tweet_id,delete_done,created_at,deleted_at,tweet_text,add_num,del_num' pn = '?,?,?,?,?,?,?' expect = 'replace into DeleteTarget (' + p1 + ') values (' + pn + ')' actual = controlar._DBControlar__del_sql self.assertEqual(expect, actual) limit_s = 300 expect = 'select * from Favorite order by id desc limit {}'.format( limit_s) actual = controlar._DBControlar__GetFavoriteSelectSQL(limit_s) self.assertEqual(expect, actual) limit_s = 300 expect = 'select * from Retweet where is_exist_saved_file = \'True\' order by id desc limit {}'.format( limit_s) actual = controlar._DBControlar__GetRetweetSelectSQL(limit_s) self.assertEqual(expect, actual) expect = 'update Retweet set is_exist_saved_file = 0 where img_filename = \'{}\''.format( self.img_filename_s) actual = controlar._DBControlar__GetRetweetFlagUpdateSQL( self.img_filename_s) self.assertEqual(expect, actual) with freezegun.freeze_time('2018-11-18 17:12:58'): url_orig_s = self.img_url_s + ":orig" td_format_s = '%a %b %d %H:%M:%S +0000 %Y' dts_format_s = '%Y-%m-%d %H:%M:%S' tca = self.tweet_s["created_at"] dst = datetime.strptime(tca, td_format_s) expect = (os.path.basename(self.img_url_s), url_orig_s, self.img_url_s + ":large", self.tweet_s["id_str"], self.tweet_s["entities"]["media"][0]["expanded_url"], dst.strftime(dts_format_s), self.tweet_s["user"]["id_str"], self.tweet_s["user"]["name"], self.tweet_s["user"]["screen_name"], self.tweet_s["text"], self.save_file_fullpath_s, datetime.now().strftime(dts_format_s)) actual = controlar._DBControlar__GetUpdateParam( self.img_url_s, self.tweet_s, self.save_file_fullpath_s) self.assertEqual(expect, actual)