import unittest from unittest.mock import MagicMock, patch from datetime import datetime, timedelta import json import os import csv from tamigo import get_worked_days, TamigoClient class TestTamigoExport(unittest.TestCase): def setUp(self): self.client = MagicMock(spec=TamigoClient) self.client.session_token = "fake-token" def test_get_worked_days_processing(self): # Mock API response mock_shifts = [ { "Date": "/Date(1741651200000)/", # 2025-03-11 "ActualShiftHours": 8.5, "ActualShiftText": "Work", "IsAbsent": False }, { "StartTime": "2025-03-10T09:00:00Z", "EndTime": "2025-03-10T17:00:00Z", "ActualShiftHours": 0, "IsAbsent": False } ] self.client.get_employee_actual_shifts.return_value = mock_shifts start_date = datetime(2025, 3, 1) end_date = datetime(2025, 3, 15) with patch('tamigo.console'): work_days = get_worked_days(self.client, start_date, end_date) self.assertIsNotNone(work_days) self.assertIn("2025-03-11", work_days) self.assertEqual(work_days["2025-03-11"]["hours"], 8.5) self.assertIn("2025-03-10", work_days) self.assertEqual(work_days["2025-03-10"]["hours"], 8.0) def test_get_worked_days_zero_hour_filtering(self): # Mock API response with a 0-hour shift (missing EndTime so it stays 0) mock_shifts = [ { "Date": "/Date(1741564800000)/", # 2025-03-10 "StartTime": "2025-03-10T09:00:00Z", "ActualShiftHours": 0, "ActualShiftText": "Sick Day", "IsAbsent": False } ] self.client.get_employee_actual_shifts.return_value = mock_shifts start_date = datetime(2025, 3, 1) end_date = datetime(2025, 3, 15) # 1. Test with show_zero_hours = False (Default) with patch('tamigo.console'), patch('tamigo.current_config', {'show_zero_hours': False}): work_days = get_worked_days(self.client, start_date, end_date) self.assertEqual(len(work_days), 0) # 2. Test with show_zero_hours = True with patch('tamigo.console'), patch('tamigo.current_config', {'show_zero_hours': True}): work_days = get_worked_days(self.client, start_date, end_date) self.assertEqual(len(work_days), 1) self.assertIn("2025-03-10", work_days) self.assertEqual(work_days["2025-03-10"]["hours"], 0) @patch('tamigo.select_date_range') @patch('tamigo.get_worked_days') @patch('questionary.select') @patch('questionary.text') @patch('tamigo.console') def test_export_worked_hours_csv(self, mock_console, mock_text, mock_select, mock_get_worked, mock_date_range): from tamigo import export_worked_hours mock_date_range.return_value = (datetime(2025, 3, 1), datetime(2025, 3, 15)) mock_get_worked.return_value = { "2025-03-11": {"hours": 8.5, "text": "Work"}, "2025-03-10": {"hours": 8.0, "text": "Work"} } mock_select.return_value.ask.return_value = "CSV" mock_text.return_value.ask.return_value = "test_export.csv" export_worked_hours(self.client) self.assertTrue(os.path.exists("test_export.csv")) with open("test_export.csv", "r") as f: reader = csv.reader(f) rows = list(reader) self.assertEqual(rows[0], ["Date", "Hours", "Details"]) # CSV rows might be in different order if dict keys are not sorted, but sorted() was used in code self.assertEqual(rows[1], ["2025-03-10", "8.00", "Work"]) self.assertEqual(rows[2], ["2025-03-11", "8.50", "Work"]) os.remove("test_export.csv") @patch('tamigo.select_date_range') @patch('tamigo.get_worked_days') @patch('questionary.select') @patch('questionary.text') @patch('tamigo.console') def test_export_worked_hours_json(self, mock_console, mock_text, mock_select, mock_get_worked, mock_date_range): from tamigo import export_worked_hours mock_date_range.return_value = (datetime(2025, 3, 1), datetime(2025, 3, 15)) mock_get_worked.return_value = { "2025-03-11": {"hours": 8.5, "text": "Work"}, "2025-03-10": {"hours": 8.0, "text": "Work"} } mock_select.return_value.ask.return_value = "JSON" mock_text.return_value.ask.return_value = "test_export.json" export_worked_hours(self.client) self.assertTrue(os.path.exists("test_export.json")) with open("test_export.json", "r") as f: data = json.load(f) self.assertEqual(data["2025-03-11"]["hours"], 8.5) os.remove("test_export.json") @patch('tamigo.select_date_range') @patch('tamigo.get_worked_days') @patch('questionary.select') @patch('questionary.text') @patch('tamigo.console') def test_export_worked_hours_xlsx(self, mock_console, mock_text, mock_select, mock_get_worked, mock_date_range): from tamigo import export_worked_hours mock_date_range.return_value = (datetime(2025, 3, 1), datetime(2025, 3, 15)) mock_get_worked.return_value = { "2025-03-11": {"hours": 8.5, "text": "Work"}, "2025-03-10": {"hours": 8.0, "text": "Work"} } mock_select.return_value.ask.return_value = "XLSX" mock_text.return_value.ask.return_value = "test_export.xlsx" export_worked_hours(self.client) self.assertTrue(os.path.exists("test_export.xlsx")) # We could use openpyxl to verify content if we really wanted to import openpyxl wb = openpyxl.load_workbook("test_export.xlsx") ws = wb.active self.assertEqual(ws.cell(row=1, column=1).value, "Date") self.assertEqual(ws.cell(row=2, column=1).value, "2025-03-10") self.assertEqual(ws.cell(row=2, column=2).value, 8.0) os.remove("test_export.xlsx") if __name__ == '__main__': unittest.main()