File size: 4,264 Bytes
bf48b89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import jsBeautify from 'js-beautify';

const routeTestFailed = 'auto: not ready to review';
const readyToReview = 'auto: ready to review';

export default async function test({ github, context, core }, baseUrl, routes, number) {
    if (routes[0] === 'NOROUTE') {
        return;
    }

    const links = routes.map((e) => {
        const l = e.startsWith('/') ? e : `/${e}`;
        return `${baseUrl}${l}`;
    });

    let commentList = [];
    let successCount = 0;
    let failCount = 0;
    let comment = `Successfully [generated](${process.env.GITHUB_SERVER_URL}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}) as following:\n`;

    for await (const lks of links) {
        core.info(`testing route:  ${lks}`);
        // Intended, one at a time
        let success = false;
        let detail;

        const res = await fetch(lks);
        const body = await res.text();
        if (res.ok) {
            success = true;
            successCount++;
            detail = jsBeautify.html(body.replaceAll(/\s+(\n|$)/g, '\n'), { indent_size: 2 });
        } else {
            if (body && !body.includes('ConfigNotFoundError')) {
                failCount++;
            }
            detail = `HTTPError: Response code ${res.status} (${res.statusText})`;
            const errInfoList = body && body.match(/(?<=<p class="message">)(.+?)(?=<\/p>)/gs);
            if (errInfoList) {
                detail += '\n\n';
                detail += errInfoList
                    .slice(0, 5)
                    .map((e) => {
                        e = e.replaceAll(/<code class="[^"]+">|<\/code>/g, '').trim();
                        return e.length > 1000 ? e.slice(0, 1000) + '...' : e;
                    })
                    .join('\n');
            }
        }

        let routeFeedback = `
<details>
<summary><a href="${lks}">${lks.replaceAll('&', '&amp;')}</a> - ${success ? 'Success ✔️' : '<b>Failed ❌</b>'}</summary>

\`\`\`${success ? 'rss' : ''}`;
        routeFeedback += `
${detail.slice(0, 65300 - routeFeedback.length)}
\`\`\`
</details>
`;
        if (comment.length + routeFeedback.length >= 65500) {
            comment += '\n\n...';
            commentList.push(comment);
            comment = routeFeedback;
        } else {
            comment += routeFeedback;
        }
    }

    if (comment.length > 0) {
        commentList.push(comment);
    }

    if (commentList.length >= 5) {
        commentList = commentList.slice(0, 5);
    }

    if (process.env.PULL_REQUEST) {
        const resultLabel = failCount === links.length || successCount <= failCount ? routeTestFailed : readyToReview;

        if (resultLabel === routeTestFailed) {
            const { data: issue } = await github.rest.issues
                .get({
                    owner: context.repo.owner,
                    repo: context.repo.repo,
                    issue_number: number,
                })
                .catch((error) => {
                    core.warning(error);
                });
            if (issue.labels.some((l) => l.name === readyToReview)) {
                await github.rest.issues
                    .removeLabel({
                        issue_number: number,
                        owner: context.repo.owner,
                        repo: context.repo.repo,
                        name: readyToReview,
                    })
                    .catch((error) => {
                        core.warning(error);
                    });
            }
        }

        await github.rest.issues
            .addLabels({
                issue_number: number,
                owner: context.repo.owner,
                repo: context.repo.repo,
                labels: [resultLabel],
            })
            .catch((error) => {
                core.warning(error);
            });
    }

    for await (const comment of commentList) {
        // Intended, one at a time
        await github.rest.issues
            .createComment({
                issue_number: number,
                owner: context.repo.owner,
                repo: context.repo.repo,
                body: comment,
            })
            .catch((error) => {
                core.warning(error);
            });
    }
}