Skip to content

Commit

Permalink
changes done in all files
Browse files Browse the repository at this point in the history
-test scripts
-Rest client (added Auto_save)
-changes in save_json_to_file
  • Loading branch information
kunal-nitor committed Sep 19, 2024
1 parent f80e222 commit 11b6f59
Show file tree
Hide file tree
Showing 48 changed files with 119 additions and 1,192 deletions.
13 changes: 0 additions & 13 deletions API_Requests/Data/Response_Body/get_data.json

This file was deleted.

30 changes: 23 additions & 7 deletions API_Requests/Lib/File_Operations.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
import datetime
import json
import os.path
from conf.conftest import logger
from conf.logger import logger


def save_json_to_file(response,file_path,response_dir='API_Requests/Data/Response_Body'):

def save_json_to_file(response,response_dir='API_Requests/Data/Response_Body'):
"""
Prepare the response data and save it to a JSON file.
:param response_dir: The response directory where all response file will be stored
:param response: The response data to be saved, can be a dict, list, tuple, or string.
:param file_path: Path to the file where the JSON data will be saved.
"""

# Create a folder based on the current date
current_date = datetime.datetime.now().strftime("%Y_%m_%d")
date_folder_path = os.path.join(response_dir, current_date)

def handle_tuple(data):
return data[0]

Expand All @@ -33,16 +38,27 @@ def handle_dict(data):
}

try:
# Create the directory if it doesn't exist
os.makedirs(date_folder_path, exist_ok=True)

# Prepare the timestamped file path
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
full_file_path = os.path.join(date_folder_path, f"response_{timestamp}.json")


# Normalize the path for logging
full_path_normalized = full_file_path.replace(os.sep,'/')

# Select the handler based on the type of response
handler = handler_mapping.get(type(response))
if not handler:
raise TypeError("Unsupported response type")
json_data = handler(response)

# Save the JSON data to the specified file
full_path = os.path.join(response_dir, file_path)
with open(full_path,'w') as file:
json.dump(json_data, file, indent=4, separators=(',',': '))
logger.info(f"JSON data successfully saved to {full_path}")
with open(full_file_path, 'w') as file:
json.dump(json_data, file, indent=4, separators=(',', ': '))
logger.info(f"JSON data successfully saved to {full_path_normalized}")
except (json.JSONDecodeError, TypeError) as e:
logger.error(f"An error occurred while preparing JSON data:{e}")
raise e
Expand Down
49 changes: 40 additions & 9 deletions API_Requests/Lib/Rest_Client.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import requests
import json
from conf.logger import logGen
from API_Requests.Lib.File_Operations import save_json_to_file

logger = logGen()

Expand All @@ -19,7 +20,8 @@ def __init__(self, base_url, headers=None):


def get_request(self, end_point=None, data=None, headers=None, json_data_fmt=False, params=None, fmt='json',
retries=0, response_with_status_code=False,verify=True):
retries=0, response_with_status_code=False,auto_save=False):

"""
This method is to send 'Get' request
:param end_point(str): API endpoint/url
Expand All @@ -30,6 +32,7 @@ def get_request(self, end_point=None, data=None, headers=None, json_data_fmt=Fal
:param fmt: used for return response type
:param retries:
:param response_with_status_code (bool): True if status code is required else false
:param auto_save (bool) : saves response into json file if True else False
:return:
"""
Expand All @@ -47,19 +50,29 @@ def get_request(self, end_point=None, data=None, headers=None, json_data_fmt=Fal
logger.info(f"Initializing GET rest call from {request_url}")
get_response = self.http_session.get(request_url, params=params, headers=headers,
data=data, verify=True)
logger.info(f"GET Response : {self.parse_response(get_response)}")
response_data = self.parse_response(get_response)

logger.info(f"GET Response : {response_data}")
logger.info(f"GET Request Status Code : {get_response.status_code}")

if get_response.status_code in self.success_status_code:
logger.info("GET request is Successful.....")

if auto_save:
save_json_to_file(response_data)

if fmt == "raw":
return get_response

if response_with_status_code:
return self.parse_response(get_response), get_response.status_code
return self.parse_response(get_response)

return response_data
else:
logger.error(f"GET Request failed....!!!")
logger.error(f"Response Error Message: {self.parse_response(get_response)}")
return self.parse_response(get_response), get_response.status_code

except Exception as exc:
if retries > 0:
logger.info(f"GET request failed, retrying : {str(retries)} more times...")
Expand All @@ -74,7 +87,7 @@ def get_request(self, end_point=None, data=None, headers=None, json_data_fmt=Fal


def post_request(self, end_point, data=None, headers=None, json_data_fmt=False, params=None,
fmt='json', retries=1, response_with_status_code=False):
fmt='json', retries=1, response_with_status_code=False,auto_save=False):
"""
This method is used to send 'POST' Request
:param end_point: API end point/url
Expand All @@ -85,6 +98,7 @@ def post_request(self, end_point, data=None, headers=None, json_data_fmt=False,
:param fmt(str) : Used for response type json or row
:param retries: Number of Retires
:param response_with_status_code(bool): True if status code is required else false
:param auto_save (bool) : saves response into json file if True else False
:return: response of the request
"""
Expand All @@ -96,14 +110,18 @@ def post_request(self, end_point, data=None, headers=None, json_data_fmt=False,
try:
logger.info(f"Initializing POST rest call from {request_url}")
post_response = self.http_session.post(request_url, params=params, headers=headers, data=data, verify=True)
logger.info(f"POST Response : {self.parse_response(post_response)}")
response_data = self.parse_response(post_response)

logger.info(f"POST Response : {response_data}")
logger.info(f"POST Request Status Code : {post_response.status_code}")
if post_response.status_code in self.success_status_code:
logger.info(f"POST Request Status Code : {post_response.status_code}")
if post_response.status_code in self.success_status_code:
logger.info("POST request is successful...")
if auto_save:
save_json_to_file(response_data)

if fmt == 'raw':
return post_response

if response_with_status_code:
return self.parse_response(post_response), post_response.status_code
return self.parse_response(post_response)
Expand All @@ -125,7 +143,7 @@ def post_request(self, end_point, data=None, headers=None, json_data_fmt=False,


def put_request(self, end_point, data=None, headers=None, json_data_fmt=False, params=None,
fmt="json", response_with_status_code=False):
fmt="json", response_with_status_code=False,auto_save=False):
"""
This method is to send put request
:param end_point (str): API endpoint/url
Expand All @@ -135,6 +153,7 @@ def put_request(self, end_point, data=None, headers=None, json_data_fmt=False, p
:param params (dict): parameters for a request
:param fmt(str): Used for response type json or raw
:param response_with_status_code (bool): True if status code os required else False
:param auto_save (bool) : saves response into json file if True else False
:return: response of the request
"""
Expand All @@ -149,10 +168,16 @@ def put_request(self, end_point, data=None, headers=None, json_data_fmt=False, p
logger.info(f"Initializing PUT rest call from {request_url}")
put_response = self.http_session.put(request_url, params=params, headers=headers,
data=data,verify=True)
response_data = self.parse_response(put_response)

logger.info(f"PUT Response : {self.parse_response(put_response)}")
logger.info(f"PUT request Status code : {put_response.status_code}")

if put_response.status_code in self.success_status_code:
logger.info("PUT request is successful.....")

if auto_save:
save_json_to_file(response_data)
if fmt == "raw":
return put_response
if response_with_status_code:
Expand All @@ -168,7 +193,7 @@ def put_request(self, end_point, data=None, headers=None, json_data_fmt=False, p


def delete_request(self, end_point, data=None, headers=None, json_data_fmt=None, params=None,
fmt="json", response_with_status_code=False):
fmt="json", response_with_status_code=False,auto_save=False):
"""
This method is to send delete request
:param end_point (str): API endpoint/URL
Expand All @@ -178,6 +203,7 @@ def delete_request(self, end_point, data=None, headers=None, json_data_fmt=None,
:param params: Used for response type json or raw
:param fmt:
:param response_with_status_coode (bool): True if Status code os required else False
:param auto_save (bool) : saves response into json file if True else False
:return: Response of the request
"""
Expand All @@ -189,10 +215,15 @@ def delete_request(self, end_point, data=None, headers=None, json_data_fmt=None,
try:
logger.info(f"Initializing DELETE REST call from {request_url}")
delete_response = self.http_session.delete(request_url, params=params, headers=headers, data=data,verify=True)
response_data = self.parse_response(delete_response)

logger.info(f"DELETE Response : {self.parse_response(delete_response)}")
logger.info(f"DELETE request Status code : {delete_response.status_code}")

if delete_response.status_code in self.success_status_code:
logger.info(f"DELETE request is successful....")
if auto_save:
save_json_to_file(response_data)
if fmt == "raw":
return delete_response
if response_with_status_code:
Expand Down
9 changes: 5 additions & 4 deletions API_Requests/Tests/test_delete_request.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
from API_Requests.Lib.Rest_Client import RestClient
from conf.config import get_config
from conf.logger import logGen
from conf.logger import logger
from conf.conftest import setup_teardown

logging = logGen()


class Test_004:
def test_004(self,setup_teardown):
"""Test to resource is deleted from Backend """
self.base_url = get_config()['API']['base_url']
self.client = RestClient(self.base_url)
self.endpoint = get_config()['API']['delete_endpoint']
self.headers = {
'Content-Type':'application/json'
}

logging.info("*********** executing test_004 ****************")
logger.info("*********** executing test_004 ****************")

# send delete request
delete_request,status_code = self.client.delete_request(end_point="objects/6",headers=self.headers,json_data_fmt=True,response_with_status_code=True)
delete_request,status_code = self.client.delete_request(end_point="objects/6",headers=self.headers,
json_data_fmt=True,response_with_status_code=True,auto_save=True)

# verify to get response
assert delete_request is not None, "DELETE request returned None"
Expand Down
12 changes: 4 additions & 8 deletions API_Requests/Tests/test_get_request.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
from API_Requests.Lib.Rest_Client import RestClient
from conf.config import get_config
from conf.logger import logGen
from conf.logger import logger
from conf.conftest import setup_teardown
from API_Requests.Lib.File_Operations import save_json_to_file


logger = logGen()


class Test_001:
Expand All @@ -15,6 +11,7 @@ def test_001(self,setup_teardown):

self.base_url = get_config()['API']['base_url']
self.client = RestClient(self.base_url)
self.endpoint = get_config()['API']['get_endpoint']

self.headers = {
'Content-Type' : 'application/json'
Expand All @@ -23,12 +20,11 @@ def test_001(self,setup_teardown):
logger.info("*********** executing test_001 ****************")

# send get request
get_request,status_code = self.client.get_request(end_point="users/2", headers=self.headers,response_with_status_code=True,json_data_fmt=True)
get_request,status_code = self.client.get_request(end_point= self.endpoint, headers=self.headers,
response_with_status_code=True,json_data_fmt=True,auto_save=True)

# verify response is not None (json)
assert get_request is not None, "GET request returned None"

logger.info(f"type of json response : {type(self.client.parse_response(get_request))}")

# saving response into json file
save_json_to_file(get_request,'get_data.json')
11 changes: 5 additions & 6 deletions API_Requests/Tests/test_no_data_found_request.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
from API_Requests.Lib.Rest_Client import RestClient, logger
from conf.config import get_config
from conf.logger import logGen
from conf.logger import logger
from conf.conftest import setup_teardown
from API_Requests.Lib.File_Operations import save_json_to_file


logging = logGen()


class Test_001:
def test_001(self,setup_teardown):
Expand All @@ -20,12 +18,13 @@ def test_001(self,setup_teardown):
'Content-Type' : 'application/json'
}

logging.info("*********** executing test_001 ****************")
logger.info("*********** executing test_006 ****************")

get_request,status_code = self.client.get_request(end_point="unknown/23", headers=self.headers,response_with_status_code=True,json_data_fmt=True)
get_request,status_code = self.client.get_request(end_point="unknown/23", headers=self.headers,
response_with_status_code=True,json_data_fmt=True,auto_save=True)

assert get_request is not None, "GET request returned None"

logger.info(f"type of json response : {type(self.client.parse_response(get_request))}")
assert status_code == 200
save_json_to_file(get_request,'get_data.json')
save_json_to_file(get_request)
8 changes: 4 additions & 4 deletions API_Requests/Tests/test_post_data_request.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
from API_Requests.Lib.Rest_Client import RestClient
from conf.config import get_config
from conf.logger import logGen
from conf.logger import logger
from conf.conftest import setup_teardown
from API_Requests.Lib.File_Operations import read_json_from_file

logger = logGen()


class Test_005:
def test_005(self,setup_teardown):
"""" Test to check POST Request is successful to add new resource into server"""

self.base_url = get_config()['API']['base_url']
self.client = RestClient(self.base_url)
self.endpoint = get_config()['API']['post_endpoint']
self.json = read_json_from_file('post_data.json')

self.headers = {
Expand All @@ -21,6 +20,7 @@ def test_005(self,setup_teardown):

logger.info("*********** executing test_005 ****************")

post_request = self.client.post_request(end_point="users",data=self.json,headers=self.headers,json_data_fmt=True,response_with_status_code=True)
post_request = self.client.post_request(end_point=self.endpoint,data=self.json,headers=self.headers,
json_data_fmt=True,response_with_status_code=True,auto_save=True)

assert post_request is not None, "POST request returned None"
8 changes: 4 additions & 4 deletions API_Requests/Tests/test_post_request.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
from API_Requests.Lib.Rest_Client import RestClient
from conf.config import get_config
from conf.logger import logGen
from conf.logger import logger
from conf.conftest import setup_teardown

logger = logGen()


class Test_002:
def test_002(self,setup_teardown):
"""" Test to check POST Request is successful to add new resource into server"""

self.base_url = get_config()['API']['base_url']
self.client = RestClient(self.base_url)
self.endpoint = get_config()['API']['post_endpoint']
self.json = {
"name": "morpheus",
"job": "leader"
Expand All @@ -25,7 +24,8 @@ def test_002(self,setup_teardown):
logger.info("*********** executing test_002 ****************")

# send post request
post_request = self.client.post_request(end_point="users", data=self.json, json_data_fmt=True, response_with_status_code=True,headers=headers)
post_request = self.client.post_request(end_point=self.endpoint, data=self.json,
json_data_fmt=True, response_with_status_code=True,headers=headers,auto_save=True)

# verify response
assert post_request is not None, "POST request returned None"
Expand Down
Loading

0 comments on commit 11b6f59

Please sign in to comment.