import json
import freezegun
import pytest
from CommonServerPython import DemistoException
expected_hr_twitter_user_get = (
"### Twitter user get results:"
"\n|Name|User name|Created At|Description|Followers Count|Tweet Count|Verified|\n"
"|---|---|---|---|---|---|---|\n|"
" Some_name | Some_user_name | 2024-11-09T09:55:45.000Z | Some_description | 12 | 15 | True |\n"
)
def util_load_json(path):
with open(path, encoding="utf-8") as f:
return json.loads(f.read())
test_data = util_load_json("test_data/test_data.json")
def side_effect_twitter_tweet_search(method, url_suffix, headers, params, ok_codes):
if int(params.get("max_results")) and (int(params.get("max_results")) < 10 or int(params.get("max_results")) > 100):
raise DemistoException(
message=f"The max_results query parameter value [{params.get('max_results')}] is not between 10 and 100",
res={
"errors": [
{
"parameters": {"max_results": f"[{params.get('max_results')}]"},
"message": f"The max_results query parameter value [{params.get('max_results')}] "
"is not between 10 and 100",
}
],
"title": "Invalid Request",
"detail": "One or more parameters to your request was invalid.",
"type": "invalid-request",
},
)
if params.get("start_time") and params.get("end_time"):
return test_data["search_tweets_response_dates"]
return test_data["search_tweets_response"]
@pytest.mark.parametrize(
"limit, start_time, end_time ,expected_output\
,expected_human_readable, expected_raw",
[
(
10,
"",
"",
test_data["search_tweet_output"],
test_data["search_tweets_human_readable"],
test_data["search_tweets_response"],
),
(
3,
"",
"",
test_data["search_tweet_output"],
test_data["search_tweets_human_readable"],
test_data["search_tweets_response"],
),
(
200,
"",
"",
test_data["search_tweet_output"],
test_data["search_tweets_human_readable"],
test_data["search_tweets_response"],
),
(
10,
"2020-11-10T00:00:00Z",
"2020-11-17T00:00:00Z",
test_data["expected_output_dates"],
"### Tweets search results:"
"\n|Tweet ID|Text|Created At|Author Name|Author Username|Likes Count|Attachments URL|\n|"
"---|---|---|---|---|---|---|\n|"
" 2020202020202020202 | some_tweet_text_1 | 2020-11-10T00:00:00.000Z | name_1 | username_1 | 0 | |\n|"
" 2929292929292929292 | some_tweet_text_2 | 2020-11-11T00:00:00.000Z | name_2 | username_2 | 0 | |\n|"
" 2828282828282828282 | some_tweet_text_3 | 2020-11-12T00:00:00.000Z | name_3 | username_3 | 0 |"
" https://url.jpg,
https://url.jpg,
https://url.jpg,
https://url.jpg |\n",
test_data["search_tweets_response_dates"],
),
],
)
def test_twitter_tweet_search_command(
mocker, limit, start_time, end_time, expected_output, expected_human_readable, expected_raw
):
"""
Given:
- API response from twitter.
When:
- twitter-tweet-search command is executed.
Then:
- Validate readable output, outputs and raw response.
"""
from Twitterv2 import Client, twitter_tweet_search_command
client = Client(base_url="some_base_url", verify=False, headers={"Authorization": "Bearer 000"})
args = {
"query": "some_tweet_text",
"start_time": start_time,
"end_time": end_time,
"limit": limit,
"next_token": "",
}
mocker.patch.object(Client, "_http_request", side_effect=side_effect_twitter_tweet_search)
if limit < 10 or limit > 100:
with pytest.raises(DemistoException):
result = twitter_tweet_search_command(client, args)
else:
result = twitter_tweet_search_command(client, args)
assert result[0].outputs == expected_output
assert result[0].readable_output == expected_human_readable
assert result[0].raw_response == expected_raw
@pytest.mark.parametrize(
"response, expected_output, expected_raw",
[(test_data["user_get_response"], test_data["result_user_get_response"], test_data["user_get_response"])],
)
def test_twitter_user_get_command(mocker, response, expected_output, expected_raw):
"""
Given:
- API response from twitter.
When:
- twitter-user-get command is executed.
Then:
- Validate readable output, outputs and raw response.
"""
from Twitterv2 import Client, twitter_user_get_command
client = Client(base_url="some_base_url", verify=False, headers={"Authorization": "Bearer 000"})
args = {
"user_name": "some_username",
"return_pinned_tweets": "True",
"limit": "10",
}
mocker.patch.object(Client, "_http_request", return_value=response)
result = twitter_user_get_command(client, args)
assert result.readable_output == expected_hr_twitter_user_get
assert result.outputs == expected_output
assert result.raw_response == expected_raw
@freezegun.freeze_time("2020-11-25T11:57:28Z")
@pytest.mark.parametrize(
"date, expected_result",
[
("7 Days ago", "2020-11-18T11:57:28Z"),
("2020-11-18T13:57:28Z", "2020-11-18T13:57:28Z"),
("2020-11-18", "2020-11-18T00:00:00Z"),
("2020/11/18", "2020-11-18T00:00:00Z"),
("18/11/2020", "2020-11-18T00:00:00Z"),
],
)
def test_date_to_iso_format(date, expected_result):
"""
Tests date_to_iso_format
Given:
- date representation
When:
- calling date_to_iso_format
Then:
- return an ISO format
"""
from Twitterv2 import date_to_iso_format
result = date_to_iso_format(date)
assert result == expected_result
@pytest.mark.parametrize(
"response, expected_result", [(test_data["search_tweets_response"], test_data["expected_output_create_context_search"])]
)
def test_create_context_data_search_tweets(response, expected_result):
"""
Tests create_context_data_search_tweets
Given:
- list of nested dictionaries
When:
- calling create_context_data_search_tweets
Then:
- return a list dictionaries according to the required context format
"""
from Twitterv2 import create_context_data_search_tweets
result, next_token = create_context_data_search_tweets(response)
assert result == expected_result
assert next_token == "some_token"
@pytest.mark.parametrize("response, expected_result", [(test_data["user_get_response"], test_data["result_user_get_response"])])
def test_create_context_data_get_user(response, expected_result):
"""
Tests create_context_data_get_user
Given:
- list of nested dictionaries
When:
- calling create_context_data_get_user
Then:
- return a list dictionaries according to the required context format
"""
from Twitterv2 import create_context_data_get_user
result = create_context_data_get_user(response, "true")
assert result == expected_result