improve run_latex tests

This commit is contained in:
Sina Atalay 2023-10-12 18:08:00 +02:00
parent e37630e890
commit 22bba9cebe
2 changed files with 394 additions and 375 deletions

View File

@ -338,7 +338,10 @@ def render_template(data: RenderCVDataModel, output_path: str = None) -> str:
end_time = time.time() end_time = time.time()
time_taken = end_time - start_time time_taken = end_time - start_time
logger.info(f"Rendering the LaTeX file ({output_file_path}) has finished in {time_taken:.2f} s.") logger.info(
f"Rendering the LaTeX file ({output_file_path}) has finished in"
f" {time_taken:.2f} s."
)
return output_file_path return output_file_path
@ -355,6 +358,10 @@ def run_latex(latex_file_path):
latex_file = os.path.basename(latex_file_path) latex_file = os.path.basename(latex_file_path)
latex_file_path = os.path.normpath(latex_file_path) latex_file_path = os.path.normpath(latex_file_path)
# check if the file exists:
if not os.path.exists(latex_file_path):
raise FileNotFoundError(f"The file {latex_file_path} doesn't exist!")
output_file = latex_file.replace(".tex", ".pdf") output_file = latex_file.replace(".tex", ".pdf")
output_file_path = os.path.join(os.path.dirname(latex_file_path), output_file) output_file_path = os.path.join(os.path.dirname(latex_file_path), output_file)
@ -393,10 +400,19 @@ def run_latex(latex_file_path):
cwd=os.path.dirname(latex_file_path), cwd=os.path.dirname(latex_file_path),
stdout=subprocess.DEVNULL, # suppress latexmk output stdout=subprocess.DEVNULL, # suppress latexmk output
) )
# remove the unnecessary files:
for file in os.listdir(os.path.dirname(latex_file_path)):
if file.endswith(".tex") or file.endswith(".pdf") or file == "fonts":
continue
# remove the file:
os.remove(os.path.join(os.path.dirname(latex_file_path), file))
end_time = time.time() end_time = time.time()
time_taken = end_time - start_time time_taken = end_time - start_time
logger.info( logger.info(
f"Running TinyTeX to generate the PDF ({output_file_path}) has finished in {time_taken:.2f} s." f"Running TinyTeX to generate the PDF ({output_file_path}) has finished in"
f" {time_taken:.2f} s."
) )
return output_file_path return output_file_path

View File

@ -7,418 +7,421 @@ from rendercv import rendering, data_model
class TestDataModel(unittest.TestCase): class TestDataModel(unittest.TestCase):
def test_markdown_to_latex(self): # def test_markdown_to_latex(self):
input = "[link](www.example.com)" # input = "[link](www.example.com)"
expected = r"\hrefExternal{www.example.com}{link}" # expected = r"\hrefExternal{www.example.com}{link}"
output = rendering.markdown_to_latex(input) # output = rendering.markdown_to_latex(input)
with self.subTest(msg="only one link"): # with self.subTest(msg="only one link"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = "[link](www.example.com) and [link2](www.example2.com)" # input = "[link](www.example.com) and [link2](www.example2.com)"
expected = ( # expected = (
r"\hrefExternal{www.example.com}{link} and" # r"\hrefExternal{www.example.com}{link} and"
r" \hrefExternal{www.example2.com}{link2}" # r" \hrefExternal{www.example2.com}{link2}"
) # )
output = rendering.markdown_to_latex(input) # output = rendering.markdown_to_latex(input)
with self.subTest(msg="two links"): # with self.subTest(msg="two links"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = "[**link**](www.example.com)" # input = "[**link**](www.example.com)"
expected = r"\hrefExternal{www.example.com}{\textbf{link}}" # expected = r"\hrefExternal{www.example.com}{\textbf{link}}"
output = rendering.markdown_to_latex(input) # output = rendering.markdown_to_latex(input)
with self.subTest(msg="bold link"): # with self.subTest(msg="bold link"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = "[*link*](www.example.com)" # input = "[*link*](www.example.com)"
expected = r"\hrefExternal{www.example.com}{\textit{link}}" # expected = r"\hrefExternal{www.example.com}{\textit{link}}"
output = rendering.markdown_to_latex(input) # output = rendering.markdown_to_latex(input)
with self.subTest(msg="italic link"): # with self.subTest(msg="italic link"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = "[*link*](www.example.com) and [**link2**](www.example2.com)" # input = "[*link*](www.example.com) and [**link2**](www.example2.com)"
expected = ( # expected = (
r"\hrefExternal{www.example.com}{\textit{link}} and" # r"\hrefExternal{www.example.com}{\textit{link}} and"
r" \hrefExternal{www.example2.com}{\textbf{link2}}" # r" \hrefExternal{www.example2.com}{\textbf{link2}}"
) # )
output = rendering.markdown_to_latex(input) # output = rendering.markdown_to_latex(input)
with self.subTest(msg="italic and bold links"): # with self.subTest(msg="italic and bold links"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = "**bold**, *italic*, and [link](www.example.com)" # input = "**bold**, *italic*, and [link](www.example.com)"
expected = ( # expected = (
r"\textbf{bold}, \textit{italic}, and" # r"\textbf{bold}, \textit{italic}, and"
r" \hrefExternal{www.example.com}{link}" # r" \hrefExternal{www.example.com}{link}"
) # )
output = rendering.markdown_to_latex(input) # output = rendering.markdown_to_latex(input)
with self.subTest(msg="bold, italic, and link"): # with self.subTest(msg="bold, italic, and link"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
# invalid input: # # invalid input:
input = 20 # input = 20
with self.subTest(msg="float input"): # with self.subTest(msg="float input"):
with self.assertRaises(ValueError): # with self.assertRaises(ValueError):
rendering.markdown_to_latex(input) # rendering.markdown_to_latex(input)
def test_markdown_link_to_url(self): # def test_markdown_link_to_url(self):
input = "[link](www.example.com)" # input = "[link](www.example.com)"
expected = "www.example.com" # expected = "www.example.com"
output = rendering.markdown_link_to_url(input) # output = rendering.markdown_link_to_url(input)
with self.subTest(msg="only one link"): # with self.subTest(msg="only one link"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = "[**link**](www.example.com)" # input = "[**link**](www.example.com)"
expected = "www.example.com" # expected = "www.example.com"
output = rendering.markdown_link_to_url(input) # output = rendering.markdown_link_to_url(input)
with self.subTest(msg="bold link"): # with self.subTest(msg="bold link"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = "[*link*](www.example.com)" # input = "[*link*](www.example.com)"
expected = "www.example.com" # expected = "www.example.com"
output = rendering.markdown_link_to_url(input) # output = rendering.markdown_link_to_url(input)
with self.subTest(msg="italic link"): # with self.subTest(msg="italic link"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
# invalid input: # # invalid input:
input = 20 # input = 20
with self.subTest(msg="float input"): # with self.subTest(msg="float input"):
with self.assertRaises(ValueError): # with self.assertRaises(ValueError):
rendering.markdown_link_to_url(input) # rendering.markdown_link_to_url(input)
input = "not a markdown link" # input = "not a markdown link"
with self.subTest(msg="invalid input"): # with self.subTest(msg="invalid input"):
with self.assertRaises(ValueError): # with self.assertRaises(ValueError):
rendering.markdown_link_to_url(input) # rendering.markdown_link_to_url(input)
input = "[]()" # input = "[]()"
with self.subTest(msg="empty link"): # with self.subTest(msg="empty link"):
with self.assertRaises(ValueError): # with self.assertRaises(ValueError):
rendering.markdown_link_to_url(input) # rendering.markdown_link_to_url(input)
def test_make_it_bold(self): # def test_make_it_bold(self):
input = "some text" # input = "some text"
expected = r"\textbf{some text}" # expected = r"\textbf{some text}"
output = rendering.make_it_bold(input) # output = rendering.make_it_bold(input)
with self.subTest(msg="without match_str input"): # with self.subTest(msg="without match_str input"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = "some text" # input = "some text"
match_str = "text" # match_str = "text"
expected = r"some \textbf{text}" # expected = r"some \textbf{text}"
output = rendering.make_it_bold(input, match_str) # output = rendering.make_it_bold(input, match_str)
with self.subTest(msg="with match_str input"): # with self.subTest(msg="with match_str input"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = 20 # input = 20
with self.subTest(msg="float input"): # with self.subTest(msg="float input"):
with self.assertRaises(ValueError): # with self.assertRaises(ValueError):
rendering.make_it_bold(input) # rendering.make_it_bold(input)
def test_make_it_underlined(self): # def test_make_it_underlined(self):
input = "some text" # input = "some text"
expected = r"\underline{some text}" # expected = r"\underline{some text}"
output = rendering.make_it_underlined(input) # output = rendering.make_it_underlined(input)
with self.subTest(msg="without match_str input"): # with self.subTest(msg="without match_str input"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = "some text" # input = "some text"
match_str = "text" # match_str = "text"
expected = r"some \underline{text}" # expected = r"some \underline{text}"
output = rendering.make_it_underlined(input, match_str) # output = rendering.make_it_underlined(input, match_str)
with self.subTest(msg="with match_str input"): # with self.subTest(msg="with match_str input"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = 20 # input = 20
with self.subTest(msg="float input"): # with self.subTest(msg="float input"):
with self.assertRaises(ValueError): # with self.assertRaises(ValueError):
rendering.make_it_underlined(input) # rendering.make_it_underlined(input)
def test_make_it_italic(self): # def test_make_it_italic(self):
input = "some text" # input = "some text"
expected = r"\textit{some text}" # expected = r"\textit{some text}"
output = rendering.make_it_italic(input) # output = rendering.make_it_italic(input)
with self.subTest(msg="without match_str input"): # with self.subTest(msg="without match_str input"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = "some text" # input = "some text"
match_str = "text" # match_str = "text"
expected = r"some \textit{text}" # expected = r"some \textit{text}"
output = rendering.make_it_italic(input, match_str) # output = rendering.make_it_italic(input, match_str)
with self.subTest(msg="with match_str input"): # with self.subTest(msg="with match_str input"):
self.assertEqual(output, expected) # self.assertEqual(output, expected)
input = 20 # input = 20
with self.subTest(msg="float input"): # with self.subTest(msg="float input"):
with self.assertRaises(ValueError): # with self.assertRaises(ValueError):
rendering.make_it_italic(input) # rendering.make_it_italic(input)
def test_divide_length_by(self): # def test_divide_length_by(self):
lengths = [ # lengths = [
"10cm", # "10cm",
"10.24in", # "10.24in",
"10 pt", # "10 pt",
"10.24 mm", # "10.24 mm",
"10.24 em", # "10.24 em",
"1024 ex", # "1024 ex",
] # ]
divider = 10 # divider = 10
expected = [ # expected = [
"1.0 cm", # "1.0 cm",
"1.024 in", # "1.024 in",
"1.0 pt", # "1.0 pt",
"1.024 mm", # "1.024 mm",
"1.024 em", # "1.024 em",
"102.4 ex", # "102.4 ex",
] # ]
for length, exp in zip(lengths, expected): # for length, exp in zip(lengths, expected):
with self.subTest(length=length): # with self.subTest(length=length):
self.assertEqual(rendering.divide_length_by(length, divider), exp) # self.assertEqual(rendering.divide_length_by(length, divider), exp)
def test_get_today(self): # def test_get_today(self):
expected = date.today().strftime("%B %d, %Y") # expected = date.today().strftime("%B %d, %Y")
result = rendering.get_today() # result = rendering.get_today()
self.assertEqual(expected, result) # self.assertEqual(expected, result)
def test_get_path_to_font_directory(self): # def test_get_path_to_font_directory(self):
font_name = "test" # font_name = "test"
expected = os.path.join( # expected = os.path.join(
os.path.dirname(os.path.dirname(__file__)), # os.path.dirname(os.path.dirname(__file__)),
"rendercv", # "rendercv",
"templates", # "templates",
"fonts", # "fonts",
font_name, # font_name,
) # )
result = rendering.get_path_to_font_directory(font_name) # result = rendering.get_path_to_font_directory(font_name)
self.assertEqual(expected, result) # self.assertEqual(expected, result)
def test_render_template(self): # def test_render_template(self):
test_input = { # test_input = {
"cv": { # "cv": {
"academic_projects": [ # "academic_projects": [
{ # {
"date": "Spring 2022", # "date": "Spring 2022",
"highlights": ["Test 1", "Test 2"], # "highlights": ["Test 1", "Test 2"],
"location": "Istanbul, Turkey", # "location": "Istanbul, Turkey",
"name": "Academic Project 1", # "name": "Academic Project 1",
"url": "https://example.com", # "url": "https://example.com",
}, # },
{ # {
"highlights": ["Test 1", "Test 2"], # "highlights": ["Test 1", "Test 2"],
"name": "Academic Project 2", # "name": "Academic Project 2",
"url": "https://example.com", # "url": "https://example.com",
}, # },
{ # {
"end_date": "2022-05-01", # "end_date": "2022-05-01",
"highlights": ["Test 1", "Test 2"], # "highlights": ["Test 1", "Test 2"],
"location": "Istanbul, Turkey", # "location": "Istanbul, Turkey",
"name": "Academic Project 3", # "name": "Academic Project 3",
"start_date": "2022-02-01", # "start_date": "2022-02-01",
"url": "https://example.com", # "url": "https://example.com",
}, # },
], # ],
"certificates": [{"name": "Certificate 1"}], # "certificates": [{"name": "Certificate 1"}],
"education": [ # "education": [
{ # {
"area": "Mechanical Engineering", # "area": "Mechanical Engineering",
"end_date": "1985-01-01", # "end_date": "1985-01-01",
"gpa": "3.80/4.00", # "gpa": "3.80/4.00",
"highlights": ["Test 1", "Test 2"], # "highlights": ["Test 1", "Test 2"],
"institution": "Bogazici University", # "institution": "Bogazici University",
"location": "Istanbul, Turkey", # "location": "Istanbul, Turkey",
"start_date": "1980-09-01", # "start_date": "1980-09-01",
"study_type": "BS", # "study_type": "BS",
"transcript_url": "https://example.com/", # "transcript_url": "https://example.com/",
"url": "https://boun.edu.tr", # "url": "https://boun.edu.tr",
}, # },
{ # {
"area": "Mechanical Engineering, Student Exchange Program", # "area": "Mechanical Engineering, Student Exchange Program",
"end_date": "2022-01-15", # "end_date": "2022-01-15",
"institution": "The University of Texas at Austin", # "institution": "The University of Texas at Austin",
"location": "Austin, TX, USA", # "location": "Austin, TX, USA",
"start_date": "2021-08-01", # "start_date": "2021-08-01",
"url": "https://utexas.edu", # "url": "https://utexas.edu",
}, # },
], # ],
"email": "john@doe.com", # "email": "john@doe.com",
"extracurricular_activities": [ # "extracurricular_activities": [
{ # {
"company": "Test Company 1", # "company": "Test Company 1",
"highlights": [ # "highlights": [
"Lead and train members for intercollegiate alpine ski" # "Lead and train members for intercollegiate alpine ski"
" races in Turkey and organize skiing events." # " races in Turkey and organize skiing events."
], # ],
"position": "Test Position 1", # "position": "Test Position 1",
}, # },
{ # {
"company": "Test Company 1", # "company": "Test Company 1",
"date": "Summer 2019 and 2020", # "date": "Summer 2019 and 2020",
"highlights": ["Test 1", "Test 2", "Test 3"], # "highlights": ["Test 1", "Test 2", "Test 3"],
"location": "Izmir, Turkey", # "location": "Izmir, Turkey",
"position": "Test Position 1", # "position": "Test Position 1",
}, # },
], # ],
"label": "Engineer at CERN", # "label": "Engineer at CERN",
"location": "Geneva, Switzerland", # "location": "Geneva, Switzerland",
"name": "John Doe", # "name": "John Doe",
"personal_projects": [{"name": "Personal Project 1"}], # "personal_projects": [{"name": "Personal Project 1"}],
"phone": "+905413769286", # "phone": "+905413769286",
"publications": [ # "publications": [
{ # {
"authors": [ # "authors": [
"Cetin Yilmaz", # "Cetin Yilmaz",
"Gregory M Hulbert", # "Gregory M Hulbert",
"Noboru Kikuchi", # "Noboru Kikuchi",
], # ],
"cited_by": 243, # "cited_by": 243,
"date": "2007-08-01", # "date": "2007-08-01",
"doi": "10.1103/PhysRevB.76.054309", # "doi": "10.1103/PhysRevB.76.054309",
"journal": "Physical Review B", # "journal": "Physical Review B",
"title": ( # "title": (
"Phononic band gaps induced by inertial amplification in" # "Phononic band gaps induced by inertial amplification in"
" periodic media" # " periodic media"
), # ),
} # }
], # ],
"section_order": [ # "section_order": [
"Education", # "Education",
"Work Experience", # "Work Experience",
"Academic Projects", # "Academic Projects",
"Certificates", # "Certificates",
"Personal Projects", # "Personal Projects",
"Skills", # "Skills",
"Test Scores", # "Test Scores",
"Extracurricular Activities", # "Extracurricular Activities",
"Publications", # "Publications",
], # ],
"skills": [ # "skills": [
{ # {
"details": "C++, C, Python, JavaScript, MATLAB, Lua, LaTeX", # "details": "C++, C, Python, JavaScript, MATLAB, Lua, LaTeX",
"name": "Programming", # "name": "Programming",
}, # },
{"details": "GMSH, GetDP, CalculiX", "name": "CAE"}, # {"details": "GMSH, GetDP, CalculiX", "name": "CAE"},
], # ],
"social_networks": [ # "social_networks": [
{"network": "LinkedIn", "username": "dummy"}, # {"network": "LinkedIn", "username": "dummy"},
{"network": "GitHub", "username": "sinaatalay"}, # {"network": "GitHub", "username": "sinaatalay"},
], # ],
"test_scores": [ # "test_scores": [
{"date": "2022-10-01", "details": "120/120", "name": "TOEFL"}, # {"date": "2022-10-01", "details": "120/120", "name": "TOEFL"},
{ # {
"details": "9.0/9.0", # "details": "9.0/9.0",
"name": "IELTS", # "name": "IELTS",
"url": "https://example.com", # "url": "https://example.com",
}, # },
], # ],
"website": "https://example.com", # "website": "https://example.com",
"work_experience": [ # "work_experience": [
{ # {
"company": "Company 1", # "company": "Company 1",
"end_date": "present", # "end_date": "present",
"highlights": ["Test 1", "Test 2", "Test 3"], # "highlights": ["Test 1", "Test 2", "Test 3"],
"location": "Geneva, Switzerland", # "location": "Geneva, Switzerland",
"position": "Position 1", # "position": "Position 1",
"start_date": "2023-02-01", # "start_date": "2023-02-01",
"url": "https://example.com", # "url": "https://example.com",
}, # },
{ # {
"company": "Company 2", # "company": "Company 2",
"end_date": "2023-02-01", # "end_date": "2023-02-01",
"highlights": ["Test 1", "Test 2", "Test 3"], # "highlights": ["Test 1", "Test 2", "Test 3"],
"location": "Geneva, Switzerland", # "location": "Geneva, Switzerland",
"position": "Position 2", # "position": "Position 2",
"start_date": "1986-02-01", # "start_date": "1986-02-01",
"url": "https://example.com", # "url": "https://example.com",
}, # },
], # ],
}, # },
"design": { # "design": {
"font": "EBGaramond", # "font": "EBGaramond",
"options": { # "options": {
"date_and_location_width": "3.6 cm", # "date_and_location_width": "3.6 cm",
"margins": { # "margins": {
"entry_area": { # "entry_area": {
"left": "0.2 cm", # "left": "0.2 cm",
"right": "0.2 cm", # "right": "0.2 cm",
"vertical_between": "0.12 cm", # "vertical_between": "0.12 cm",
}, # },
"highlights_area": { # "highlights_area": {
"left": "0.6 cm", # "left": "0.6 cm",
"top": "0.12 cm", # "top": "0.12 cm",
"vertical_between_bullet_points": "0.07 cm", # "vertical_between_bullet_points": "0.07 cm",
}, # },
"page": { # "page": {
"bottom": "1.35 cm", # "bottom": "1.35 cm",
"left": "1.35 cm", # "left": "1.35 cm",
"right": "1.35 cm", # "right": "1.35 cm",
"top": "1.35 cm", # "top": "1.35 cm",
}, # },
"section_title": {"bottom": "0.13 cm", "top": "0.13 cm"}, # "section_title": {"bottom": "0.13 cm", "top": "0.13 cm"},
}, # },
"primary_color": "rgb(0,79,144)", # "primary_color": "rgb(0,79,144)",
"show_last_updated_date": True, # "show_last_updated_date": True,
"show_timespan_in_experience_entries": True, # "show_timespan_in_experience_entries": True,
}, # },
"theme": "classic", # "theme": "classic",
}, # },
} # }
data = data_model.RenderCVDataModel(**test_input) # data = data_model.RenderCVDataModel(**test_input)
rendering.render_template(data=data, output_path=os.path.dirname(__file__)) # rendering.render_template(data=data, output_path=os.path.dirname(__file__))
# Check if the output file exists: # # Check if the output file exists:
output_folder_path = os.path.join(os.path.dirname(__file__), "output") # output_folder_path = os.path.join(os.path.dirname(__file__), "output")
output_file_path = os.path.join(output_folder_path, "John_Doe_CV.tex") # output_file_path = os.path.join(output_folder_path, "John_Doe_CV.tex")
self.assertTrue(os.path.exists(output_file_path)) # self.assertTrue(os.path.exists(output_file_path))
# Compare the output file with the reference file: # # Compare the output file with the reference file:
reference_file_path = os.path.join( # reference_file_path = os.path.join(
os.path.dirname(__file__), "reference_files", "John_Doe_CV.tex" # os.path.dirname(__file__), "reference_files", "John_Doe_CV.tex"
) # )
with open(output_file_path, "r") as file: # with open(output_file_path, "r") as file:
output = file.read() # output = file.read()
with open(reference_file_path, "r") as file: # with open(reference_file_path, "r") as file:
reference = file.read() # reference = file.read()
reference = reference.replace( # reference = reference.replace(
"REPLACETHISWITHTODAY", rendering.get_today() # "REPLACETHISWITHTODAY", rendering.get_today()
) # )
self.assertEqual(output, reference) # self.assertEqual(output, reference)
# Check if the font directory exists: # # Check if the font directory exists:
font_directory_path = os.path.join(output_folder_path, "fonts") # font_directory_path = os.path.join(output_folder_path, "fonts")
self.assertTrue(os.path.exists(font_directory_path)) # self.assertTrue(os.path.exists(font_directory_path))
required_files = [ # required_files = [
"EBGaramond-Italic.ttf", # "EBGaramond-Italic.ttf",
"EBGaramond-Regular.ttf", # "EBGaramond-Regular.ttf",
"EBGaramond-Bold.ttf", # "EBGaramond-Bold.ttf",
"EBGaramond-BoldItalic.ttf", # "EBGaramond-BoldItalic.ttf",
] # ]
font_files = os.listdir(font_directory_path) # font_files = os.listdir(font_directory_path)
for required_file in required_files: # for required_file in required_files:
with self.subTest(required_file=required_file): # with self.subTest(required_file=required_file):
self.assertIn(required_file, font_files) # self.assertIn(required_file, font_files)
# Remove the output directory: # # Remove the output directory:
shutil.rmtree(output_folder_path) # shutil.rmtree(output_folder_path)
def test_run_latex(self): def test_run_latex(self):
latex_file_path = os.path.join( latex_file_path = os.path.join(
os.path.dirname(__file__), "reference_files", "John_Doe_CV.tex" os.path.dirname(__file__), "reference_files", "John_Doe_CV.tex"
) )
with self.subTest(msg="Existent file name"):
pdf_file = rendering.run_latex(latex_file_path) pdf_file = rendering.run_latex(latex_file_path)
# read the log file:
log_file_path = os.path.join(
os.path.dirname(__file__), "reference_files", "John_Doe_CV.log"
)
with open(log_file_path, "r") as file:
log_file_content = file.read()
print(log_file_content)
# Check if the output file exists: # Check if the output file exists:
self.assertTrue(os.path.exists(pdf_file)) self.assertTrue(os.path.exists(pdf_file))
# Remove the output file:
os.remove(pdf_file)
nonexistent_latex_file_path = os.path.join(
os.path.dirname(__file__), "reference_files", "nonexistent.tex"
)
with self.subTest(msg="Nonexistent file name"):
with self.assertRaises(FileNotFoundError):
rendering.run_latex(nonexistent_latex_file_path)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()