Files
tamigo-cli/test_export.py

202 lines
8.1 KiB
Python
Raw Permalink Normal View History

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('questionary.select')
@patch('questionary.text')
@patch('tamigo.console')
def test_export_worked_hours_respects_zero_hour_filtering(self, mock_console, mock_text, mock_select, mock_date_range):
from tamigo import export_worked_hours
# Mock API response with a 0-hour shift
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
mock_date_range.return_value = (datetime(2025, 3, 1), datetime(2025, 3, 15))
# 1. Test with show_zero_hours = False -> Should NOT export anything
with patch('tamigo.current_config', {'show_zero_hours': False}):
export_worked_hours(self.client)
# Verify the warning was printed
mock_console.print.assert_any_call("[warning]WARNING: NO LOG ENTRIES DETECTED.[/warning]")
self.assertFalse(os.path.exists("tamigo_export_20250301_20250315.csv"))
# 2. Test with show_zero_hours = True -> Should export the 0-hour day
mock_select.return_value.ask.return_value = "CSV"
mock_text.return_value.ask.return_value = "test_zero_export.csv"
with patch('tamigo.current_config', {'show_zero_hours': True}):
export_worked_hours(self.client)
self.assertTrue(os.path.exists("test_zero_export.csv"))
with open("test_zero_export.csv", "r") as f:
rows = list(csv.reader(f))
self.assertEqual(len(rows), 2) # Header + 1 data row
self.assertEqual(rows[1][0], "2025-03-10")
self.assertEqual(rows[1][1], "0.00")
os.remove("test_zero_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_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()