-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathpytest_report_issues.py
More file actions
149 lines (120 loc) · 5.02 KB
/
pytest_report_issues.py
File metadata and controls
149 lines (120 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import sys
import re
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
def cronbot_post_uka(slack_webclient_token, channel_id, message, status, linecolor):
# WebClient instantiates a client that can call API methods
client = WebClient(token=slack_webclient_token)
try:
# Call the conversations.list method using the WebClient
client.chat_postMessage(
channel=channel_id,
text=f'{status} Test for mlbstatsapi',
attachments=
[
{
"color": f'{linecolor}',
"blocks": [
{
"type": "context",
"elements": [
{
"type": "mrkdwn",
"text": f"```\n{message}\n```"
}
]
},
]
}
]
)
except SlackApiError as e:
print(f"Error: {e}")
def escape_ansi(line):
ansi_escape = re.compile(r'(?:\x1B[@-_]|[\x80-\x9F])[0-?]*[@-~]')
return ansi_escape.sub('', line)
def generate_outputstring(from_list) -> str:
short_test_summary_info_types = ["FAILED", "ERROR", "SKIPPED",
"XFAILED", "XPASSED", "PASSED"]
testing_output = ""
for output in from_list:
output = escape_ansi(output)
if len(output) > 78:
if output[:10] == "==========":
output = output.replace("=", "")
# print ([*output])
output = '{:=^78}'.format(output[:-2]) + '\r\n'
elif output[-8] == "[" and output[-3] == "]":
if output[-12:-8] != " ":
output = list(output)
output[-15] = '.'
output[-14] = '.'
output[-13] = '.'
output[-12] = ' '
output[-11] = ' '
output[-10] = ' '
output[-9] = ' '
output = ''.join(output)
output = output[:72] + output[-8:]
elif output[:10] == "collecting":
output = ' '.join(output[16:].split()[-3:]) + '\r\n'
elif output.split()[0] in short_test_summary_info_types:
output_listified = output.split()
output = ' '.join(output_listified[:2])
output += '\r\n'
temp_string = ' ' * (len(output_listified[0]))
for word in output_listified[2:]:
if len(temp_string) + 1 + len(word) <= 78:
temp_string+=" " + word
else:
if len(word) > 78 - len(output_listified[0]) + 1:
for char in word:
if len(temp_string) >= 78:
temp_string += '\r\n'
output += temp_string
temp_string = ' ' * (len(output_listified[0]) + 1)
temp_string += char
else:
temp_string += " " + char
else:
temp_string += '\r\n'
output += temp_string
temp_string = ' ' * (len(output_listified[0]) + 1)
temp_string += word
output += temp_string
output += '\r\n'
else:
output = output[:75] + "...\r\n"
if output[0] == "." and output[-8] == "[" and output[-3] == "]":
pass
else:
testing_output+=output
return testing_output
if __name__ == "__main__":
channelid = sys.argv[1]
token = sys.argv[2]
output_list = []
line = None
for line in sys.stdin:
output_list.append(line)
if not line:
statusmessage = "failed"
statuscolor = "#cd3920"
elif ("failed" in line or "xfailed" in line):
statusmessage = "Failed"
statuscolor = "#cd3920"
elif ("errors" in line or "error" in line or "SKIPPED" in line):
statusmessage = "Error with"
statuscolor = "#f2a029"
else:
statusmessage = "Successful"
statuscolor = "#3ca553"
outputbody = generate_outputstring(output_list)
cronbot_post_uka(token, channelid, outputbody, statusmessage, statuscolor)
# Once the slack message has been sent, if our periodic test fails, then
# exit with exit code 1. In turn failing the actions job. Print the
# result of the tests before so we have access in github actions to the
# tests results.
if statusmessage == "failed":
print (outputbody)
sys.exit(1)