aboutsummaryrefslogtreecommitdiffstats
path: root/.github/scripts/tests/apply_user_properties_to_junit.py
blob: 145e368681cc4f41faaff85f8e8497874137f85f (plain) (blame)
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
#!/usr/bin/env python3
import json
import os
import argparse
import xml.etree.ElementTree as ET
from xml.dom import minidom


def add_properties_to_testcases(root, all_properties):
    # Iterate over every testsuite tag
    for testsuite in root.findall('testsuite'):
        directory_name = testsuite.attrib.get('name')

        # Iterate over every testcase tag
        for testcase in testsuite.findall('testcase'):
            testcase_full_name = testcase.attrib.get('name')

            # Attempt to split the test name  into components
            parts = testcase_full_name.split(".", 2)
            if len(parts) == 3:
                file_name = ".".join(parts[:2])
                test_name = ".".join(parts[2:])

                full_test_path = os.path.join(directory_name, file_name)

                # Check if the full test path and test name exist in all_properties
                if full_test_path in all_properties and test_name in all_properties[full_test_path]:
                    properties_to_add = all_properties[full_test_path][test_name]

                    # Find or create <properties>
                    properties_elem = testcase.find('properties')
                    if properties_elem is None:
                        properties_elem = ET.SubElement(testcase, 'properties')

                    # Add properties if not already present
                    for prop_name, prop_value in properties_to_add.items():
                        exists = False
                        for prop in properties_elem.findall('property'):
                            if prop.attrib.get('name') == prop_name:
                                exists = True
                                break
                        if not exists:
                            ET.SubElement(properties_elem, 'property', name=prop_name, value=prop_value)

def load_all_properties(test_dir):
    all_properties = {}

    for dirpath, _, filenames in os.walk(test_dir):
        for filename in filenames:
            properties_file_path = os.path.abspath(os.path.join(dirpath, filename))

            if os.path.isfile(properties_file_path):
                with open(properties_file_path, "r") as upf:
                    properties = json.load(upf)

                # Merge properties into all_properties
                for key, value in properties.items():
                    if key not in all_properties:
                        all_properties[key] = value
                    else:
                        all_properties[key].update(value)

    return all_properties

def update_junit(test_dir, junit_file, out_file):
    tree = ET.parse(junit_file)
    root = tree.getroot()

    all_properties = load_all_properties(test_dir)
    add_properties_to_testcases(root, all_properties)

    xml_str = ET.tostring(root, 'utf-8')

    parsed_str = minidom.parseString(xml_str)
    pretty_xml_str = parsed_str.toprettyxml()

    with open(out_file, 'w', encoding='utf-8') as f:
        f.write(pretty_xml_str)

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--test_dir')
    parser.add_argument("--in_file", type=str)
    parser.add_argument("--out_file", type=str)

    args = parser.parse_args()

    update_junit(args.test_dir, args.in_file, args.out_file)

if __name__ == "__main__":
    main()