def test_do_steady_tweets(self, mocker: MockerFixture, gp_bot: GomiPeopleBot): # 静的ツイートに該当しない時間の場合 assert gp_bot.do_steady_tweets(datetime(2020, 1, 1, 0, 8, 0)) == False # 静的ツイートに該当する時間の場合(サンプルで定時報告のみ) mocker.patch.object(TwitterAPI, "PostUpdate", side_effect=mocked_post_tweet) assert gp_bot.do_steady_tweets(datetime(2020, 1, 1, 3, 30, 0)) == True
def test_get_latest_status_id(self, mocker: MockerFixture, gp_bot: GomiPeopleBot): # 自身のツイートが存在しない場合 mocker.patch.object(TwitterAPI, "GetUserTimeline", return_value=[]) assert gp_bot.get_latest_status_id() is None # 自身のツイートが存在するが、リプライツイートがない場合 mocker.patch.object(TwitterAPI, "GetUserTimeline", return_value=SELF_TWEETS[:2]) assert gp_bot.get_latest_status_id() == "9999_1" # 自身のツイートが存在し、リプライツイートがある場合 mocker.patch.object(TwitterAPI, "GetUserTimeline", return_value=SELF_TWEETS) assert gp_bot.get_latest_status_id() == "9999_3"
def gp_bot(): from gp_bot.bot import GomiPeopleBot # 単体テスト時に誤って投稿されない(エラーを起こす)ためにあえて _HOGE を付加 consumer_key = os.environ.get("TWITTER_CONSUMER_KEY") + "_HOGE" consumer_secret = os.environ.get("TWITTER_CONSUMER_SECRET") + "_HOGE" access_token_key = os.environ.get("TWITTER_ACCESS_TOKEN_KEY") + "_HOGE" access_token_secret = os.environ.get( "TWITTER_ACCESS_TOKEN_SECRET") + "_HOGE" return GomiPeopleBot(consumer_key, consumer_secret, access_token_key, access_token_secret, "/workspaces/gp_bot/result/model.pth")
def test_do_mentions(self, mocker: MockerFixture, gp_bot: GomiPeopleBot): # 指定した分間隔でない場合 assert gp_bot.do_mentions(datetime(2020, 1, 1, 0, 8, 0), "TEST_MENTION_ID") == False # メンションが1件もない場合 mocker.patch.object(TwitterAPI, "GetMentions", return_value=[]) assert gp_bot.do_mentions(datetime(2020, 1, 1, 0, 20, 0), "TEST_MENTION_ID") == False # last_mention_idがNoneかつメンションがある場合 mocker.patch.object(TwitterAPI, "GetMentions", return_value=MENTIONED_TWEETS) assert gp_bot.do_mentions(datetime(2020, 1, 1, 0, 20, 0), None) == False # 返信を行う場合で受けたメンションがMAX_N_MENTIONSで指定された件数以下の場合 mocker.patch.object(TwitterAPI, "PostUpdate", side_effect=mocked_post_tweet) mocker.patch.object(TwitterAPI, "GetMentions", return_value=MENTIONED_TWEETS[:4]) assert gp_bot.do_mentions(datetime(2020, 1, 1, 0, 20, 0), "TEST_MENTION_ID") == True # 返信を行う場合で受けたメンションがMAX_N_MENTIONSで指定された件数より多い場合 posted_mock = mocker.patch.object(TwitterAPI, "PostUpdate", side_effect=mocked_post_tweet) mocker.patch.object(TwitterAPI, "GetMentions", return_value=MENTIONED_TWEETS) assert gp_bot.do_mentions(datetime(2020, 1, 1, 0, 20, 0), "TEST_MENTION_ID") == True # メンション先はランダムで決まるため、PostUpdateのモック関数が呼ばれた回数で判断 assert posted_mock.call_count == MAX_N_MENTIONS
def test_post(self, mocker: MockerFixture, gp_bot: GomiPeopleBot): mocker.patch.object(TwitterAPI, "PostUpdate", side_effect=mocked_post_tweet) # メンションIDありの場合 assert gp_bot.post("test", "0001_1") == "9999_1" # メンションIDなし(None)の場合 assert gp_bot.post("test") == "9999_0" # テキストがNoneの場合 with pytest.raises(ValueError): gp_bot.post(None) # テキストが空文字の場合 with pytest.raises(ValueError): gp_bot.post("")
def test_generate_text(self, gp_bot: GomiPeopleBot): text = gp_bot.generate_text(20) assert isinstance(text, str) assert len(text) <= 20
def test_load_steady_tweets(self, gp_bot: GomiPeopleBot): tweets = gp_bot.load_steady_tweets("/workspaces/gp_bot/steady_tweets.yml") # 1件だけ確認する assert {"type": "%H:%M", "dt": "03:30", "text": "サンジハン!!"} in tweets
def __init__(self, batch_size: int, bptt: int, clip: float, corpus: Corpus, dropout: float, emb_size: int, epochs: int, lr: int, n_hidden: int, n_layers: int, cuda: bool = False, logger: Optional[Logger] = None) -> None: """コンストラクタ. Parameters ---------- batch_size : int バッチサイズ bptt : int Back-Propagation Through Time(シーケンスサイズ) clip : float 勾配のNormのClipping閾値 corpus : :obj:`Corpus` コーパス情報 dropout : float Dropout率 emb_size : int 入力ベクトルの次元数 epochs : int Epoch数 lr : int 学習率 n_hidden : int LSTMの隠れユニットの次元数 n_layers : int Reccurentレイヤー数 cuda : bool, optional GPUを利用するか否かのフラグ(デフォルト:利用しない) logging : logging.Logger, optional ロガー """ self.criterion = nn.CrossEntropyLoss() self.batch_size = batch_size self.bptt = bptt self.clip = clip self.corpus = corpus self.emb_size = emb_size self.epochs = epochs self.dropout = dropout self.lr = lr self.n_hidden = n_hidden self.n_layers = n_layers self.n_vocab = len(corpus.dictionary) self.all_total_loss: List[float] = [] self.device = torch.device("cuda" if cuda else "cpu") self.model = GPLangModel(self.n_vocab, self.emb_size, self.n_hidden, self.n_layers, self.dropout).to(self.device) self.corpus.train_data = self.batchfy(self.corpus.train_data) self.logger = logger if logger else GomiPeopleBot.create_logger()