Browse Source

RRE_ update

Akash Singh 3 years ago
parent
commit
466c45d539

+ 58 - 3
baangt/TestDataGenerator/TestDataGenerator.py

@@ -365,6 +365,29 @@ class TestDataGenerator:
             processed_datas = self.__processRrd(first_value, second_value,evaluated_dict)
             processed_datas = data_type(processed_datas)
 
+        elif prefix == "Rre":
+            file_name = raw_data[1:-1].split(',')[0].strip()
+            sheet_dict, _ = self.__read_excel(file_name)
+            first_value = raw_data[1:-1].split(',')[1].strip()
+            second_value = raw_data[1:-1].split(',')[2].strip()
+            if second_value[0] == "[":
+                second_value = ','.join(raw_data[1:-1].split(',')[2:]).strip()
+                second_value = second_value[:second_value.index(']')+1]
+                third_value = [x.strip() for x in ']'.join(raw_data[1:-1].split(']')[1:]).split(',')[1:]]
+            else:
+                third_value = [x.strip() for x in raw_data[1:-1].split(',')[3:]]
+            evaluated_list = ']],'.join(','.join(third_value)[1:-1].strip().split('],')).split('],')
+            if evaluated_list[0] == "":
+                evaluated_dict = {}
+            else:
+                evaluated_dict = {
+                    splited_data.split(':')[0]: self.__splitList(splited_data.split(':')[1])  for splited_data in evaluated_list
+                }
+            if second_value[0] == "[" and second_value[-1] == "]":
+                second_value = self.__splitList(second_value)
+            processed_datas = self.__processRrd(first_value, second_value, evaluated_dict, sheet_dict)
+            processed_datas = data_type(processed_datas)
+
         elif "-" in raw_data:
             raw_data = raw_data.split('-')
             start = raw_data[0].strip()
@@ -419,6 +442,11 @@ class TestDataGenerator:
                     raw_string = self.__process_rrd_string(raw_string)
                     raw_string = raw_string[4:]
                     data_type = tuple
+                elif raw_string[:4].lower() == "rre_":         # Remote Random (Remote = other sheet)
+                    prefix = "Rre"
+                    raw_string = self.__process_rre_string(raw_string)
+                    raw_string = raw_string[4:]
+                    data_type = tuple
                 else:
                     data_type = list
             else:
@@ -469,7 +497,7 @@ class TestDataGenerator:
         proccesed_datas = [data.strip() for data in raw_data[1:-1].split(",")]
         return proccesed_datas
 
-    def __processRrd(self, sheet_name, data_looking_for, data_to_match: dict):
+    def __processRrd(self, sheet_name, data_looking_for, data_to_match: dict, sheet_dict=None, caller="RRD_"):
         """
         This function is internal function to process the data wil RRD_ prefix.
         The General input in excel file is like ``RRD_[sheetName,TargetData,[Header:[values**],Header:[values**]]]``
@@ -493,9 +521,11 @@ class TestDataGenerator:
         :param data_to_match:
         :return: dictionary of TargetData
         """
+        sheet_dict = self.sheet_dict if sheet_dict is None else sheet_dict
         matching_data = [list(x) for x in itertools.product(*[data_to_match[key] for key in data_to_match])]
-        assert sheet_name in self.sheet_dict, f"Excel file doesn't contain {sheet_name} sheet. Please recheck. Called in 'RRD_'"
-        base_sheet = self.sheet_dict[sheet_name]
+        assert sheet_name in sheet_dict, \
+            f"Excel file doesn't contain {sheet_name} sheet. Please recheck. Called in '{caller}'"
+        base_sheet = sheet_dict[sheet_name]
         data_lis = []
         if type(data_looking_for) == str:
             data_looking_for = data_looking_for.split(",")
@@ -539,6 +569,31 @@ class TestDataGenerator:
         assert match, err_string
         return processed_string
 
+    def __process_rre_string(self, rrd_string):
+        """
+        This method is used to validate rrd_strings provided by the user.
+        If their will be any error in string this fuction will immediately create an error and will stop further execution.
+        Also these function will remove empty spaces around the commas in string.
+        Regex supporting formats in this method are:
+        ``RRE_[fileName,sheetName,TargetData,[Header:[values**],Header:[values**]]]``
+        ``RRE_[fileName,sheetName,[TargetData**],[Header:[values**],Header:[values**]]]``
+        ``RRE_(fileName,sheetName,[TargetData**],[Header:[values**],Header:[values**]])``
+        ``RRE_[fileName,sheetName,*,[Header:[values**],Header:[values**]]]``
+        ``RRE_[fileName,sheetName,*,[Header:[values**],Header:[values**]]]``
+        ``RRE_[fileName,sheetName,TargetData,[]]``
+        ``RRE_(fileName,sheetName,TargetData,[])``
+        ``RRE_(fileName,sheetName,*,[])``
+        ``RRE_[fileName,sheetName,*,[]]``
+        :param rrd_string:
+        :return:
+        """
+        processed_string = ','.join([word.strip() for word in rrd_string.split(', ')])
+        match = re.match(r"(RRE_(\(|\[))[\w\d\s\-./\\]+\.(xlsx|xls),[a-zA-z0-9\s]+,(\[?[a-zA-z\s,]+\]?|)|\*,\[([a-zA-z0-9\s]+:\[[a-zA-z0-9,\s]+\](,?))*\]",processed_string)
+        err_string = f"{rrd_string} not matching pattern RRE_(fileName, sheetName, TargetData," \
+                     f"[Header1:[Value1],Header2:[Value1,Value2]])"
+        assert match, err_string
+        return processed_string
+
 if __name__ == "__main__":
     lTestDataGenerator = TestDataGenerator("../../tests/0TestInput/RawTestData.xlsx")
     lTestDataGenerator.write()

+ 57 - 3
baangt/base/HandleDatabase.py

@@ -140,6 +140,11 @@ class HandleDatabase:
                         rrd_data = self.__rrd_string_to_python(rrd_string[4:], fileName)
                         for data in rrd_data:
                             new_data_dic[data] = rrd_data[data]
+                    if temp_dic[keys][:4] == "RRE_":
+                        rrd_string = self.__process_rre_string(temp_dic[keys])
+                        rrd_data = self.__rre_string_to_python(rrd_string[4:])
+                        for data in rrd_data:
+                            new_data_dic[data] = rrd_data[data]
             for key in new_data_dic:
                 temp_dic[key] = new_data_dic[key]
 
@@ -158,7 +163,7 @@ class HandleDatabase:
                     lAppend = False
         return lAppend
 
-    def __processRrd(self, sheet_name, data_looking_for, data_to_match: dict):
+    def __processRrd(self, sheet_name, data_looking_for, data_to_match: dict, sheet_dict=None, caller="RRD_"):
         """
         For more detail please refer to TestDataGenerator.py
         :param sheet_name:
@@ -166,9 +171,11 @@ class HandleDatabase:
         :param data_to_match:
         :return: dictionary of TargetData
         """
+        sheet_dict = self.sheet_dict if sheet_dict is None else sheet_dict
         matching_data = [list(x) for x in itertools.product(*[data_to_match[key] for key in data_to_match])]
-        assert sheet_name in self.sheet_dict, f"Excel file doesn't contain {sheet_name} sheet. Please recheck. Called in 'RRD_'"
-        base_sheet = self.sheet_dict[sheet_name]
+        assert sheet_name in sheet_dict, \
+            f"Excel file doesn't contain {sheet_name} sheet. Please recheck. Called in '{caller}'"
+        base_sheet = sheet_dict[sheet_name]
         data_lis = []
         if type(data_looking_for) == str:
             data_looking_for = data_looking_for.split(",")
@@ -219,6 +226,53 @@ class HandleDatabase:
                                        f"but didn't find anything"
         return processed_datas[randint(0, len(processed_datas)-1)]
 
+    def __rre_string_to_python(self, raw_data):
+        """
+        Convert string to python data types
+        :param raw_data:
+        :return:
+        """
+        file_name = raw_data[1:-1].split(',')[0].strip()
+        sheet_dict, _ = self.__read_excel(file_name)
+        first_value = raw_data[1:-1].split(',')[1].strip()
+        second_value = raw_data[1:-1].split(',')[2].strip()
+        if second_value[0] == "[":
+            second_value = ','.join(raw_data[1:-1].split(',')[2:]).strip()
+            second_value = second_value[:second_value.index(']') + 1]
+            third_value = [x.strip() for x in ']'.join(raw_data[1:-1].split(']')[1:]).split(',')[1:]]
+        else:
+            third_value = [x.strip() for x in raw_data[1:-1].split(',')[3:]]
+        evaluated_list = ']],'.join(','.join(third_value)[1:-1].strip().split('],')).split('],')
+        if evaluated_list[0] == "":
+            evaluated_dict = {}
+        else:
+            evaluated_dict = {
+                splited_data.split(':')[0]: self.__splitList(splited_data.split(':')[1]) for splited_data in
+                evaluated_list
+            }
+        if second_value[0] == "[" and second_value[-1] == "]":
+            second_value = self.__splitList(second_value)
+        processed_datas = self.__processRrd(first_value, second_value, evaluated_dict, sheet_dict, caller="RRE_")
+        assert len(processed_datas)>0, f"No matching data for RRD_. Please check the input file. Was searching for " \
+                                       f"{first_value}, {second_value} and {str(evaluated_dict)} " \
+                                       f"but didn't find anything"
+        return processed_datas[randint(0, len(processed_datas)-1)]
+
+    def __process_rre_string(self, rre_string):
+        """
+        For more detail please refer to TestDataGenerator.py
+        :param rre_string:
+        :return:
+        """
+        processed_string = ','.join([word.strip() for word in rre_string.split(', ')])
+        match = re.match(
+            r"(RRE_(\(|\[))[\w\d\s\-./\\]+\.(xlsx|xls),[a-zA-z0-9\s]+,(\[?[a-zA-z\s,]+\]?|)|\*,\[([a-zA-z0-9\s]+:\[[a-zA-z0-9,\s]+\](,?))*\]",
+            processed_string)
+        err_string = f"{rre_string} not matching pattern RRE_(fileName, sheetName, TargetData," \
+                     f"[Header1:[Value1],Header2:[Value1,Value2]])"
+        assert match, err_string
+        return processed_string
+
     def __process_rrd_string(self, rrd_string):
         """
         For more detail please refer to TestDataGenerator.py

BIN
docs/DataGeneratorInput.png


+ 7 - 1
docs/Datagenerator.rst

@@ -21,6 +21,7 @@ This image is an example input file. Different types of data types supported are
   7. ``FKR_`` prefix is used here.
   8. ``FKR_`` prefix is used here with a new integer value 0 in end.
   9. ``RRD_`` prefix is used here.
+  10. ``RRE_`` prefix is used here.
 
 Using these data type we will generate all possible values.
 Here is a simple example with simple value and value of list.
@@ -98,6 +99,10 @@ We will use the reference of above image and assigned number to learn about it i
      selecting random data only the rows which have same value of that header will be considered.
      i.e. First ``RRD_`` cell has value "x" for the header while selected randomly, then the second cell will select data
      randomly only from the rows which have "x" value for the same header.
+  10. ``RRE_`` is same as ``RRD_`` only change is that in rrd we take data from same file and different sheet but, in
+     this ``RRE_`` prefix we can take data from another file. The only change in its structure is that filename comes
+     before sheetname.
+     i.e. ``RRE_[fileName,sheetName,Targetdata,[key:value]]``
 
 
 All Data Types Format
@@ -110,4 +115,5 @@ All Data Types Format
 5. random from range = ``RND_<start>-<end>,<step>``
 6. List of header    = ``[<title1>, <title2>, <title3>]``
 7. Faker Prefix      = ``FKR_(<type>, <locale>, <number_of_data>)``
-8. RRD Prefix        = ``RRD_(<sheetName>,<TargetData>,[<Header1>:[<Value1>],<Header2>:[<Value1>,<Value2>]])``
+8. RRD Prefix        = ``RRD_(<sheetName>,<TargetData>,[<Header1>:[<Value1>],<Header2>:[<Value1>,<Value2>]])``
+9. RRE Prefix        = ``RRE_(<fileName>,<sheetName>,<TargetData>,[<Header1>:[<Value1>],<Header2>:[<Value1>,<Value2>]])``

BIN
tests/0TestInput/RawTestData.xlsx


+ 28 - 0
tests/test_TestDataGenerator.py

@@ -108,3 +108,31 @@ def test_rrd_no_data_to_match():
     for data in rrd_output_dict:
         print(data)
 
+def test_rre_simple_input():
+    # Checks __processRrd to get dict to target data
+    rrd_output_dict = testDataGenerator._TestDataGenerator__data_generators(
+        "RRE_[examples/CompleteBaangtWebdemo.xlsx,CustomerData,[NameFirst,NameLast],[Stage:[Test]]]"
+    )
+    assert len(rrd_output_dict) == 5
+    for data in rrd_output_dict:
+        print(data)
+
+
+def test_rre_target_data_all():
+    # Checks __processRrd to get dict to for all data of matching values
+    rrd_output_dict = testDataGenerator._TestDataGenerator__data_generators(
+        "RRE_[examples/CompleteBaangtWebdemo.xlsx,CustomerData,*,[Stage:[Test]]]"
+    )
+    assert len(rrd_output_dict) == 5
+    for data in rrd_output_dict:
+        print(data)
+
+
+def test_rre_no_data_to_match():
+    # Checks __processRrd to get dict to for all data of when no value of matching is given
+    rrd_output_dict = testDataGenerator._TestDataGenerator__data_generators(
+        "RRE_[examples/CompleteBaangtWebdemo.xlsx,CustomerData,*,[]"
+    )
+    assert len(rrd_output_dict) == 10
+    for data in rrd_output_dict:
+        print(data)