def innerResourceInstanceMethod(*args,**kwargs) : resourceInstance = args[0] completeResponse = None if logRequest : log.prettyJson( resourceInstanceMethod, 'bodyRequest', json.loads(Serializer.jsonifyIt(args[1:])), condition = logRequest, logLevel = log.DEBUG ) try : FlaskManager.validateKwargs( kwargs, resourceInstance, innerResourceInstanceMethod, requestHeaderClass = requestHeaderClass, requestParamClass = requestParamClass ) FlaskManager.validateArgs(args, requestClass, innerResourceInstanceMethod) completeResponse = resourceInstanceMethod(*args,**kwargs) FlaskManager.validateResponseClass(responseClass, completeResponse) except Exception as exception : log.warning(innerResourceInstanceMethod, 'Not posssible to complete request', exception=exception) raise exception controllerResponse = completeResponse[0] if ObjectHelper.isNotNone(completeResponse[0]) else {'message' : completeResponse[1].enumName} if logResponse : log.prettyJson( resourceInstanceMethod, 'bodyResponse', json.loads(Serializer.jsonifyIt(controllerResponse)), condition = logResponse, logLevel = log.DEBUG ) return completeResponse[0]
def publicControllerMethod(args, kwargs, contentType, resourceInstance, resourceInstanceMethod, requestHeaderClass, requestParamClass, requestClass, logRequest): if resourceInstanceMethod.__name__ in OpenApiManager.ABLE_TO_RECIEVE_BODY_LIST and requestClass: requestBodyAsJson = getRequestBodyAsJson(contentType, requestClass) if logRequest: log.prettyJson(resourceInstanceMethod, 'bodyRequest', requestBodyAsJson, condition=logRequest, logLevel=log.DEBUG) if Serializer.requestBodyIsPresent(requestBodyAsJson): serializerReturn = Serializer.convertFromJsonToObject( requestBodyAsJson, requestClass) args = getArgsWithSerializerReturnAppended(args, serializerReturn) addToKwargs(KW_HEADERS, requestHeaderClass, request.headers, kwargs) addToKwargs(KW_PARAMETERS, requestParamClass, request.args, kwargs) response = resourceInstanceMethod(resourceInstance, *args[1:], **kwargs) if response and Serializer.isSerializerCollection(response) and 2 == len( response): return response raise GlobalException.GlobalException( logMessage= f'''Bad implementation of {resourceInstance.__class__.__name__}.{resourceInstanceMethod.__class__.__name__}() controller method''' )
def validateResponseClass(responseClass, controllerResponse): if isNotPythonFrameworkHttpsResponse(controllerResponse): raiseBadResponseImplementation( f'Python Framework response cannot be null. It should be a list like this: [{"RESPONSE_CLASS" if ObjectHelper.isNone(responseClass) else responseClass if ObjectHelper.isNotList(responseClass) else responseClass[0]}, HTTPS_CODE]' ) if ObjectHelper.isNotNone(responseClass): if Serializer.isSerializerList(responseClass): if 0 == len(responseClass): log.warning(validateResponseClass, f'"responseClass" was not defined') elif 1 == len(responseClass): if ObjectHelper.isNotList(responseClass[0]): if not isinstance(controllerResponse[0], responseClass[0]): raiseBadResponseImplementation( f'Response class does not match expected class. Expected "{responseClass[0].__name__}", response "{controllerResponse[0].__class__.__name__}"' ) elif ObjectHelper.isNotList(responseClass[0][0]): if ObjectHelper.isNotList(controllerResponse[0]): raiseBadResponseImplementation( f'Response is not a list. Expected "{responseClass[0].__class__.__name__}", but found "{controllerResponse[0].__class__.__name__}"' ) elif Serializer.isSerializerList( controllerResponse[0] ) and 0 < len(controllerResponse[0]) and not isinstance( controllerResponse[0][0], responseClass[0][0]): raiseBadResponseImplementation( f'Response element class does not match expected element class. Expected "{responseClass[0][0].__name__}", response "{controllerResponse[0][0].__class__.__name__}"' ) else: if not isinstance(controllerResponse[0], responseClass): raiseBadResponseImplementation( f'Response class does not match expected class. Expected "{responseClass.__name__}", response "{controllerResponse[0].__class__.__name__}"' ) else: log.warning(validateResponseClass, f'"responseClass" was not defined')
def jsonifyIt() : assert '{"myString": "myValue", "myInteger": 0, "myFloat": 0.099}' == Serializer.jsonifyIt(MY_DICTIONARY) myGenerator = generatorFunction() assert myGenerator == Serializer.jsonifyIt(myGenerator) assert '{"myAttribute": null, "myNeutralAttribute": "someString"}' == Serializer.jsonifyIt(MyClass()) assert '{"id": null}' == Serializer.jsonifyIt(MyEntityClass()) father = Father() child = Child() brother = Brother() otherFather = Father() otherBrother = Brother() otherChild = Child() father.id = 1 child.id = 2 brother.id = 3 otherFather.id = 4 otherBrother.id = 5 otherChild.id = 6 father.childList = [child, otherChild] father.brotherList = [otherBrother] child.father = father child.fatherId = father.id child.brother = brother child.brotherId = brother.id brother.father = otherFather brother.fatherId = otherFather.id brother.child = child otherFather.childList = [] otherFather.brotherList = [brother] otherBrother.father = father otherBrother.fatherId = father.id otherBrother.child = otherChild otherChild.father = father otherChild.fatherId = father.id otherChild.brother = otherBrother otherChild.brotherId = otherBrother.id assert '{"brother": {"child": null, "father": {"brotherList": [], "childList": [], "id": 4}, "fatherId": 4, "id": 3}, "brotherId": 3, "father": {"brotherList": [{"child": {"brother": null, "brotherId": 5, "father": null, "fatherId": 1, "id": 6}, "father": null, "fatherId": 1, "id": 5}], "childList": [{"brother": {"child": null, "father": null, "fatherId": 1, "id": 5}, "brotherId": 5, "father": null, "fatherId": 1, "id": 6}], "id": 1}, "fatherId": 1, "id": 2}' == Serializer.jsonifyIt(child) assert '{"brotherList": [{"child": {"brother": null, "brotherId": 5, "father": null, "fatherId": 1, "id": 6}, "father": null, "fatherId": 1, "id": 5}], "childList": [{"brother": {"child": null, "father": {"brotherList": [], "childList": [], "id": 4}, "fatherId": 4, "id": 3}, "brotherId": 3, "father": null, "fatherId": 1, "id": 2}, {"brother": {"child": null, "father": null, "fatherId": 1, "id": 5}, "brotherId": 5, "father": null, "fatherId": 1, "id": 6}], "id": 1}' == Serializer.jsonifyIt(father) myClass = MyClass() myAttributeClass = MyAttributeClass(myClass=myClass) myClass.myAttribute = myAttributeClass assert '{"myAttribute": {"myClass": null, "myNeutralClassAttribute": "someOtherString"}, "myNeutralAttribute": "someString"}' == Serializer.jsonifyIt(myClass) assert '{"myClass": {"myAttribute": null, "myNeutralAttribute": "someString"}, "myNeutralClassAttribute": "someOtherString"}' == Serializer.jsonifyIt(myClass.myAttribute)
def weirdIdList() : #arrange class TestContact(MODEL): __tablename__ = 'TestContact' id = sap.Column(sap.Integer(), sap.Sequence(f'{__tablename__}{sap.ID}{sap.SEQ}'), primary_key=True) key = sap.Column(sap.String(128), nullable=False) def __init__(self, id = None, key = None ): self.id = id self.key = key def __repr__(self): return f'{self.__tablename__}(id: {self.id}, key: {self.key})' class TestContactRequestDto : def __init__(self, key = None ) : self.key = key class TestContactResponseDto : def __init__(self, id = None, key = None ) : self.id = id self.key = key model = TestContact(id=2, key="a") #act dto = Serializer.convertFromObjectToObject(model, TestContactResponseDto) assert int == type(dto.id) assert 2 == dto.id
def addToKwargs(key, givenClass, valuesAsDictionary, kwargs): if ObjectHelper.isNotEmpty(givenClass): toClass = givenClass if ObjectHelper.isNotList( givenClass) else givenClass[0] kwargs[key] = Serializer.convertFromJsonToObject( {k: v for k, v in valuesAsDictionary.items()}, toClass)
def getArgsWithResponseClassInstanceAppended(args, responseClass): if responseClass: resourceInstance = args[0] objectRequest = args[1] serializerReturn = Serializer.convertFromObjectToObject( objectRequest, responseClass) args = getArgsWithSerializerReturnAppended(args, serializerReturn) return args
def convertFromObjectToObject_whenTargetClassIsList() : # arrange a = RandomHelper.string() b = RandomHelper.string() c = RandomHelper.string() otherA = MyOtherDto(RandomHelper.string()) otherB = MyOtherDto(RandomHelper.string()) otherC = MyOtherDto(RandomHelper.string()) myFirst = MyDto(RandomHelper.string(), otherA, [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), None), RandomHelper.integer())]), RandomHelper.integer())]), RandomHelper.integer())]), RandomHelper.integer())]) mySecond = MyDto(RandomHelper.string(), otherB, [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), None), RandomHelper.integer())]), RandomHelper.integer())]), RandomHelper.integer())]), RandomHelper.integer())]) myThird = MyDto(RandomHelper.string(), otherC, [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), [MyThirdDto(MyDto(RandomHelper.string(), MyOtherDto(RandomHelper.string()), None), RandomHelper.integer())]), RandomHelper.integer())]), RandomHelper.integer())]), RandomHelper.integer())]) thirdOne = RandomHelper.integer() thirdTwo = RandomHelper.integer() thirdThree = RandomHelper.integer() myThirdOne = [MyThirdDto(myFirst, thirdOne)] myThirdTwo = [MyThirdDto(mySecond, thirdTwo)] myThirdThree = [MyThirdDto(myThird, thirdThree)] expected = [MyDto(a, otherA, myThirdOne), MyDto(b, otherB, myThirdTwo), MyDto(c, otherC, myThirdThree)] null = 'null' inspectEquals = False # act toAssert = Serializer.convertFromObjectToObject(expected, [[MyDto]]) another = Serializer.convertFromObjectToObject([MyDto(a, otherA, [MyThirdDto(myFirst, thirdOne)]), MyDto(b, otherB, myThirdTwo), MyDto(c, otherC, myThirdThree)], [[MyDto]]) another[0].myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my = MyDto( MyDto(RandomHelper.string(), None, None), expected[0].myThirdList[0].my.myOther, expected[0].myThirdList[0].my.myThirdList ) # assert assert expected == toAssert, f'{expected} == {toAssert}: {expected == toAssert}' assert ObjectHelper.equals(expected, toAssert) assert ObjectHelper.isNotNone(expected[0].myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my) assert expected[0].myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my == toAssert[0].myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my assert ObjectHelper.equals(expected[0].myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my, toAssert[0].myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my) assert ObjectHelper.isNone(expected[0].myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList) assert ObjectHelper.equals(expected[0].myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList, toAssert[0].myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList[0].my.myThirdList) assert ObjectHelper.equals(json.loads(Serializer.jsonifyIt(expected)), json.loads(Serializer.jsonifyIt(toAssert))), f'ObjectHelper.equals({json.loads(Serializer.jsonifyIt(expected))},\n\n{json.loads(Serializer.jsonifyIt(toAssert))})' assert False == (expected == another), f'False == ({expected} == {another}): False == {(expected == another)}' assert False == ObjectHelper.equals(expected, another, muteLogs=not inspectEquals) assert False == ObjectHelper.equals(another, expected, muteLogs=not inspectEquals) assert False == ObjectHelper.equals(another, toAssert, muteLogs=not inspectEquals) assert False == ObjectHelper.equals(toAssert, another, muteLogs=not inspectEquals) assert str(expected) == str(toAssert), f'str({str(expected)}) == str({str(toAssert)}): {str(expected) == str(toAssert)}'
def getControllerList(resourceName): controllerNameList = getControllerNameList(resourceName) importedControllerList = [] for controllerName in controllerNameList: resource = Serializer.importResource(controllerName, resourceModuleName=resourceName) if resource: importedControllerList.append(resource) return importedControllerList
def notSecuredMethod(args, kwargs, contentType, resourceInstance, resourceInstanceMethod, requestClass): if resourceInstanceMethod.__name__ in OpenApiManager.ABLE_TO_RECIEVE_BODY_LIST and requestClass: requestBodyAsJson = getRequestBodyAsJson( contentType) ###- request.get_json() if requestBodyAsJson: serializerReturn = Serializer.convertFromJsonToObject( requestBodyAsJson, requestClass) args = getArgsWithSerializerReturnAppended(serializerReturn, args, isControllerMethod=True) return resourceInstanceMethod(resourceInstance, *args[1:], **kwargs)
def innerResourceInstanceMethod(*args, **kwargs): # r.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # r.headers["Pragma"] = "no-cache" # r.headers["Expires"] = "0" # r.headers['Cache-Control'] = 'public, max-age=0' resourceInstance = args[0] completeResponse = None try: if ObjectHelper.isNotEmptyCollection(roleRequired): completeResponse = securedControllerMethod( args, kwargs, consumes, resourceInstance, resourceInstanceMethod, roleRequired, requestHeaderClass, requestParamClass, requestClass, logRequest) else: completeResponse = publicControllerMethod( args, kwargs, consumes, resourceInstance, resourceInstanceMethod, requestHeaderClass, requestParamClass, requestClass, logRequest) # print(f'completeResponse: {completeResponse}') validateResponseClass(responseClass, completeResponse) except Exception as exception: # print(exception) completeResponse = getCompleteResponseByException( exception, resourceInstance, resourceInstanceMethod) ###- request.method: GET ###- request.url: http://127.0.0.1:5000/alert/dingding/test?x=y ###- request.base_url: http://127.0.0.1:5000/alert/dingding/test ###- request.url_charset: utf-8 ###- request.url_root: http://127.0.0.1:5000/ ###- str(request.url_rule): /alert/dingding/test ###- request.host_url: http://127.0.0.1:5000/ ###- request.host: 127.0.0.1:5000 ###- request.script_root: ###- request.path: /alert/dingding/test ###- request.full_path: /alert/dingding/test?x=y ###- request.args: ImmutableMultiDict([('x', 'y')]) ###- request.args.get('x'): y controllerResponse = completeResponse[0] if ObjectHelper.isNotNone( completeResponse[0]) else { 'message': completeResponse[1].enumName } status = completeResponse[1] if logResponse: log.prettyJson(resourceInstanceMethod, 'bodyResponse', json.loads( Serializer.jsonifyIt(controllerResponse)), condition=logResponse, logLevel=log.DEBUG) return jsonifyResponse(controllerResponse, produces, status)
def validateArgs(args, requestClass, method): if requestClass: resourceInstance = args[0] if Serializer.isList(requestClass): for index in range(len(requestClass)): if Serializer.isList( args[index + 1]) and len(args[index + 1]) > 0: expecteObjectClass = requestClass[index][0] for objectInstance in args[index + 1]: GlobalException.validateArgs(resourceInstance, method, objectInstance, expecteObjectClass) else: objectRequest = args[index + 1] expecteObjectClass = requestClass[index] GlobalException.validateArgs(resourceInstance, method, objectRequest, expecteObjectClass) else: objectRequest = args[1] expecteObjectClass = requestClass GlobalException.validateArgs(resourceInstance, method, objectRequest, expecteObjectClass)
def getResourceList(apiInstance, resourceType): resourceNameList = getResourceNameList( apiInstance.globals.apiTree[apiInstance.globals.apiPackage], resourceType) resourceList = [] for resourceName in resourceNameList: if FlaskManager.KW_CONTROLLER_RESOURCE == resourceName[ -len(FlaskManager.KW_CONTROLLER_RESOURCE):]: resourceList += getControllerList(resourceName) else: resource = Serializer.importResource(resourceName) if resource: resourceList.append(resource) return resourceList
def getOnActuatorHealth(self, dto, headers=None, params=None): # print(dto.__dict__) # print(headers.__dict__) # print(params.__dict__) import requests from python_framework.api.src.helper import Serializer response = requests.put( f'{self.url}{self.getOnActuatorHealth.url}', data=Serializer.jsonifyIt(dto), params=Serializer.getObjectAsDictionary(params), headers={ 'Content-Type': self.getOnActuatorHealth.consumes, **Serializer.getObjectAsDictionary(headers) }) # print(response.text) return TestRequestDto.TestResponseDto( status=Serializer.convertFromJsonToObject( response.json(), [[ActuatorHealthDto.ActuatorHealthResponseDto]])[0].status, first=params.first, second=params.second, firstHeader=headers.firstHeader, secondHeader=headers.secondHeader), HttpStatus.map( response.status_code)
def getNullableChildDtoClass(attributeName, dtoClass, verb, url, documentation): log.log( getNullableChildDtoClass, f'attributeName: {attributeName}, dtoClass: {dtoClass}, verb: {verb}, url: {url}' ) childDtoClass = Serializer.getTargetClassFromFatherClassAndChildMethodName( dtoClass, attributeName) log.log(getNullableChildDtoClass, f'childDtoClass: {childDtoClass}') if childDtoClass: if ReflectionHelper.getName(type(type)) == ReflectionHelper.getName( type(childDtoClass)): addDtoToUrlVerb(verb, url, childDtoClass, documentation) else: addDtoToUrlVerb(verb, url, type(childDtoClass), documentation) return childDtoClass
def isModelTest() : assert False == Serializer.isModel(generatorFunction()) assert False == Serializer.isModel(MyClass()) assert True == Serializer.isModel(MyEntityClass())
def appendArgs(args, argument, isControllerMethod=False): if isControllerMethod and Serializer.isList(argument): return args + argument args.append(argument) return args
def jsonifyResponse(object, contentType, status): return Response(Serializer.jsonifyIt(object), mimetype=contentType, status=status)
def jsonifyResponse(response, contentType, status): return Response(Serializer.jsonifyIt(response), mimetype=contentType, status=status)
def toResponseDto(dto, toClass): if not (ObjectHelper.isNone(dto) or ObjectHelper.isNone(toClass)): return Serializer.convertFromObjectToObject(dto, toClass) return dto
def fromDtoToModel() : # arrange mockedDatetimeAsString = '2021-03-11 08:30:00' mockedDateAsString = mockedDatetimeAsString.split()[0] mockedTimeAsString = mockedDatetimeAsString.split()[1] instance = DateTimeTestResponseDto( beginAtDatetime = mockedDatetimeAsString, endAtDatetime = mockedDatetimeAsString, beginAtDate = mockedDateAsString, endAtDate = mockedDateAsString, beginAtTime = mockedTimeAsString, endAtTime = mockedTimeAsString, intervalTime = mockedDatetimeAsString, timedelta = mockedTimeAsString ) # log.prettyPython(fromModelToDto, 'instance', Serializer.getObjectAsDictionary(instance), logLevel=log.DEBUG) instanceList = [ instance, instance ] # act toAssert = Serializer.convertFromObjectToObject(instance, DateTimeTest) listToAssert = Serializer.convertFromObjectToObject(instanceList, [[DateTimeTest]]) # log.prettyPython(fromDtoToModel, 'toAssert', Serializer.getObjectAsDictionary(toAssert), logLevel=log.DEBUG) # log.prettyPython(fromModelToDto, 'listToAssert', Serializer.getObjectAsDictionary(listToAssert), logLevel=log.DEBUG) # assert assert ObjectHelper.isNotEmpty(toAssert) assert datetime.datetime == type(toAssert.beginAtDatetime) assert datetime.datetime == type(toAssert.endAtDatetime) assert datetime.date == type(toAssert.beginAtDate) assert datetime.date == type(toAssert.endAtDate) assert datetime.time == type(toAssert.beginAtTime) assert datetime.time == type(toAssert.endAtTime) assert datetime.datetime == type(toAssert.intervalTime) assert datetime.timedelta == type(toAssert.timedelta) assert ObjectHelper.equals( { 'beginAtDate': '2021-03-11', 'beginAtDatetime': '2021-03-11 08:30:00', 'beginAtTime': '08:30:00', 'endAtDate': '2021-03-11', 'endAtDatetime': '2021-03-11 08:30:00', 'endAtTime': '08:30:00', 'id': None, 'intervalTime': '2021-03-11 08:30:00', 'timedelta': '08:30:00' }, Serializer.getObjectAsDictionary(toAssert), ignoreKeyList = [ 'timedelta' ] ) assert ObjectHelper.isNotEmpty(listToAssert) assert ObjectHelper.equals( [ { 'beginAtDate': '2021-03-11', 'beginAtDatetime': '2021-03-11 08:30:00', 'beginAtTime': '08:30:00', 'endAtDate': '2021-03-11', 'endAtDatetime': '2021-03-11 08:30:00', 'endAtTime': '08:30:00', 'id': None, 'intervalTime': '2021-03-11 08:30:00', 'timedelta': '08:30:00' }, { 'beginAtDate': '2021-03-11', 'beginAtDatetime': '2021-03-11 08:30:00', 'beginAtTime': '08:30:00', 'endAtDate': '2021-03-11', 'endAtDatetime': '2021-03-11 08:30:00', 'endAtTime': '08:30:00', 'id': None, 'intervalTime': '2021-03-11 08:30:00', 'timedelta': '08:30:00' } ], Serializer.getObjectAsDictionary(listToAssert), ignoreKeyList = [ 'timedelta' ] )
def isJsonifyable() : assert False == Serializer.isJsonifyable(generatorFunction()) assert True == Serializer.isJsonifyable(MyClass()) assert True == Serializer.isJsonifyable(MyEntityClass())
def convertFromJsonToObject_whenThereAreEnums() : # arrange jsonToConvert = [ { "beginAtDate": "2021-03-11", "beginAtTime": "08:00:00", "endAtDate": "2021-03-11", "endAtTime": "09:00:00", "hoster": "Tati", "service": "teams", "url": "https://teams.microsoft.com/dl/launcher/launcher.html?url=%2F_%23%2Fl%2Fmeetup-join%2F19%3Ameeting_Y2Q1MWI1MWMtOWE0YS00OWJkLTkxNGMtYWMxNDczNTgxYTlj%40thread.v2%2F0%3Fcontext%3D%257b%2522Tid%2522%253a%2522b8329613-0680-4673-a03f-9a18a0b0e93b%2522%252c%2522Oid%2522%253a%2522fcb6e799-c1f0-4556-be74-3302ea89c13d%2522%257d%26anon%3Dtrue&type=meetup-join&deeplinkId=98d55d14-abc6-4abf-a4a8-5af45024d137&directDl=true&msLaunch=true&enableMobilePage=true&suppressPrompt=true" }, { "beginAtDate": "2021-03-11", "beginAtTime": "14:00:00", "endAtDate": "2021-03-11", "endAtTime": "15:00:00", "hoster": "Cristiano / Tati", "note": "Alinhamento Desmarcação", "service": "teams", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_YzQ3YTY1ZWUtYzg4Ny00NDg1LTkwNGEtYTBhYmNhM2RjOWZi%40thread.v2/0?context=%7b%22Tid%22%3a%22647631af-8bf8-4048-a98f-b1fbee134a6d%22%2c%22Oid%22%3a%22be78d394-2f08-4059-bee9-97b849e03cdb%22%7d" }, { "beginAtDate": "2021-03-16", "beginAtTime": "10:00:00", "endAtDate": "2021-03-16", "endAtTime": "11:00:00", "hoster": "Riachuelo", "note": "Daily Riachuelo - Terça", "type": "DAILY", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_MmQ5ZjliYmQtZDZhYi00MjkwLWE2NGMtOWIxMmUzYzZhYjFh%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" }, { "beginAtDate": "2021-03-10", "beginAtTime": "10:00:00", "endAtDate": "2021-03-10", "endAtTime": "11:00:00", "hoster": "Riachuelo", "note": "Daily Riachuelo - Quarda", "type": "DAILY", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_MmQ5ZjliYmQtZDZhYi00MjkwLWE2NGMtOWIxMmUzYzZhYjFh%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" }, { "beginAtDate": "2021-03-12", "beginAtTime": "10:00:00", "endAtDate": "2021-03-12", "endAtTime": "11:00:00", "hoster": "Riachuelo", "note": "Daily Riachuelo - Sexta", "type": "DAILY", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_MmQ5ZjliYmQtZDZhYi00MjkwLWE2NGMtOWIxMmUzYzZhYjFh%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" }, { "beginAtDate": "2021-03-15", "beginAtTime": "15:00:00", "endAtDate": "2021-03-15", "endAtTime": "16:00:00", "hoster": "Riachuelo", "note": "Daily Riachuelo - Segunda", "type": "DAILY", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_ZDZmMGUzY2UtZWQzZS00NDQ3LWEwZDMtMzc0MzQwYjYxNWQ1%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" }, { "beginAtDate": "2021-03-11", "beginAtTime": "17:30:00", "endAtDate": "2021-03-11", "endAtTime": "18:30:00", "hoster": "Riachuelo", "note": "Daily Riachuelo - Quinta", "type": "DAILY", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_Y2Q1MWI1MWMtOWE0YS00OWJkLTkxNGMtYWMxNDczNTgxYTlj%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" }, { "beginAtDate": "2021-03-18", "beginAtTime": "11:00:00", "endAtDate": "2021-03-18", "endAtTime": "12:00:00", "hoster": "Hoffmann", "note": "CWI - Trimestral", "service": "meet", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_Y2Q1MWI1MWMtOWE0YS00OWJkLTkxNGMtYWMxNDczNTgxYTlj%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" } ] # act toAssert = Serializer.convertFromJsonToObject(jsonToConvert, [[TestCallRequestDto]]) # assert # print(Serializer.prettify(Serializer.getObjectAsDictionary(toAssert))) assert 'meet' == CallServiceName.CallServiceName.map('meet') assert 'zoom' == CallServiceName.CallServiceName.map('zoom') assert 'teams' == CallServiceName.CallServiceName.map('teams') assert 'UNIQUE' == CallType.CallType.map('UNIQUE') assert 'DAILY' == CallType.CallType.map('DAILY') assert 'INCOMMING' == CallStatus.CallStatus.map('INCOMMING') assert 'WASTED' == CallStatus.CallStatus.map('WASTED') assert ObjectHelper.equals( [ { "beginAtDate": "2021-03-11", "beginAtTime": "08:00:00", "endAtDate": "2021-03-11", "endAtTime": "09:00:00", "hoster": "Tati", "note": None, "service": "teams", "status": None, "type": None, "url": "https://teams.microsoft.com/dl/launcher/launcher.html?url=%2F_%23%2Fl%2Fmeetup-join%2F19%3Ameeting_Y2Q1MWI1MWMtOWE0YS00OWJkLTkxNGMtYWMxNDczNTgxYTlj%40thread.v2%2F0%3Fcontext%3D%257b%2522Tid%2522%253a%2522b8329613-0680-4673-a03f-9a18a0b0e93b%2522%252c%2522Oid%2522%253a%2522fcb6e799-c1f0-4556-be74-3302ea89c13d%2522%257d%26anon%3Dtrue&type=meetup-join&deeplinkId=98d55d14-abc6-4abf-a4a8-5af45024d137&directDl=true&msLaunch=true&enableMobilePage=true&suppressPrompt=true" }, { "beginAtDate": "2021-03-11", "beginAtTime": "14:00:00", "endAtDate": "2021-03-11", "endAtTime": "15:00:00", "hoster": "Cristiano / Tati", "note": "Alinhamento Desmarcação", "service": "teams", "status": None, "type": None, "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_YzQ3YTY1ZWUtYzg4Ny00NDg1LTkwNGEtYTBhYmNhM2RjOWZi%40thread.v2/0?context=%7b%22Tid%22%3a%22647631af-8bf8-4048-a98f-b1fbee134a6d%22%2c%22Oid%22%3a%22be78d394-2f08-4059-bee9-97b849e03cdb%22%7d" }, { "beginAtDate": "2021-03-16", "beginAtTime": "10:00:00", "endAtDate": "2021-03-16", "endAtTime": "11:00:00", "hoster": "Riachuelo", "note": "Daily Riachuelo - Terça", "service": None, "status": None, "type": "DAILY", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_MmQ5ZjliYmQtZDZhYi00MjkwLWE2NGMtOWIxMmUzYzZhYjFh%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" }, { "beginAtDate": "2021-03-10", "beginAtTime": "10:00:00", "endAtDate": "2021-03-10", "endAtTime": "11:00:00", "hoster": "Riachuelo", "note": "Daily Riachuelo - Quarda", "service": None, "status": None, "type": "DAILY", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_MmQ5ZjliYmQtZDZhYi00MjkwLWE2NGMtOWIxMmUzYzZhYjFh%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" }, { "beginAtDate": "2021-03-12", "beginAtTime": "10:00:00", "endAtDate": "2021-03-12", "endAtTime": "11:00:00", "hoster": "Riachuelo", "note": "Daily Riachuelo - Sexta", "service": None, "status": None, "type": "DAILY", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_MmQ5ZjliYmQtZDZhYi00MjkwLWE2NGMtOWIxMmUzYzZhYjFh%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" }, { "beginAtDate": "2021-03-15", "beginAtTime": "15:00:00", "endAtDate": "2021-03-15", "endAtTime": "16:00:00", "hoster": "Riachuelo", "note": "Daily Riachuelo - Segunda", "service": None, "status": None, "type": "DAILY", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_ZDZmMGUzY2UtZWQzZS00NDQ3LWEwZDMtMzc0MzQwYjYxNWQ1%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" }, { "beginAtDate": "2021-03-11", "beginAtTime": "17:30:00", "endAtDate": "2021-03-11", "endAtTime": "18:30:00", "hoster": "Riachuelo", "note": "Daily Riachuelo - Quinta", "service": None, "status": None, "type": "DAILY", "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_Y2Q1MWI1MWMtOWE0YS00OWJkLTkxNGMtYWMxNDczNTgxYTlj%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" }, { "beginAtDate": "2021-03-18", "beginAtTime": "11:00:00", "endAtDate": "2021-03-18", "endAtTime": "12:00:00", "hoster": "Hoffmann", "note": "CWI - Trimestral", "service": "meet", "status": None, "type": None, "url": "https://teams.microsoft.com/l/meetup-join/19%3ameeting_Y2Q1MWI1MWMtOWE0YS00OWJkLTkxNGMtYWMxNDczNTgxYTlj%40thread.v2/0?context=%7b%22Tid%22%3a%22b8329613-0680-4673-a03f-9a18a0b0e93b%22%2c%22Oid%22%3a%22fcb6e799-c1f0-4556-be74-3302ea89c13d%22%7d" } ], Serializer.getObjectAsDictionary(toAssert) )