diff --git a/server/src/test/transient_data/test_transient_data.py b/server/src/test/transient_data/test_transient_data.py
new file mode 100644
index 0000000..10a4e94
--- /dev/null
+++ b/server/src/test/transient_data/test_transient_data.py
@@ -0,0 +1,88 @@
+import unittest
+from unittest.mock import patch, MagicMock
+from src.functions.transient_data.transient_data import fetch_trains, fetch_luas, fetch_buses, batch_upload_to_dynamodb, lambda_handler
+
+class TestTransientData(unittest.TestCase):
+
+ @patch('src.functions.transient_data.transient_data.session.get')
+ def test_fetch_trains_returns_data(self, mock_get):
+ mock_response = MagicMock()
+ mock_response.text = '12353.349805-6.26031Running2023-10-10On timeNorth'
+ mock_get.return_value = mock_response
+
+ with patch('src.functions.transient_data.transient_data.xmltodict.parse', return_value={
+ "ArrayOfObjTrainPositions": {
+ "objTrainPositions": [{
+ "TrainCode": "123",
+ "TrainLatitude": "53.349805",
+ "TrainLongitude": "-6.26031",
+ "TrainStatus": "Running",
+ "TrainDate": "2023-10-10",
+ "PublicMessage": "On time",
+ "Direction": "North"
+ }]
+ }
+ }):
+ result = fetch_trains()
+ self.assertEqual(len(result), 3) # Expecting 3 items for 3 train types
+ self.assertEqual(result[0]['trainCode'], '123')
+
+ @patch('src.functions.transient_data.transient_data.session.get')
+ def test_fetch_luas_returns_data(self, mock_get):
+ # Mock the response for the Luas stops data
+ mock_stops_response = MagicMock()
+ mock_stops_response.content.decode.return_value = 'Abbreviation\tLatitude\tLongitude\tName\tIrishName\tStopID\tLineID\tSortOrder\tIsEnabled\tIsParkAndRide\tIsCycleAndRide\tZoneCountA\tZoneCountB\nSTP1\t53.349805\t-6.26031\tStop1\tStop1Irish\t1\t1\t1\t1\t0\t0\t1\t1'
+ mock_forecast_response = MagicMock()
+ mock_forecast_response.text = 'On timeNorth'
+ mock_get.side_effect = [mock_stops_response, mock_forecast_response]
+
+ result = fetch_luas()
+ self.assertGreater(len(result), 0)
+ self.assertIn('luasStopName', result[0])
+
+ @patch('src.functions.transient_data.transient_data.session.get')
+ @patch.dict('os.environ', {'PERMANENT_DATA_API': 'http://mocked_api'})
+ def test_fetch_buses_returns_data(self, mock_get):
+ mock_response = MagicMock()
+ mock_response.json.return_value = {
+ "entity": [
+ {
+ "id": "1",
+ "vehicle": {
+ "position": {"latitude": 53.349805, "longitude": -6.26031},
+ "trip": {"route_id": "123", "trip_id": "456", "start_time": "10:00",
+ "start_date": "2023-10-10", "schedule_relationship": "Scheduled",
+ "direction_id": 0}
+ }
+ }
+ ]
+ }
+ mock_get.return_value = mock_response
+
+ result = fetch_buses()
+ self.assertEqual(len(result), 1)
+ self.assertEqual(result[0]['busID'], '1')
+
+ @patch('src.functions.transient_data.transient_data.table.batch_writer')
+ def test_batch_upload_to_dynamodb_uploads_data(self, mock_batch_writer):
+ mock_batch = MagicMock()
+ mock_batch_writer.return_value.__enter__.return_value = mock_batch
+
+ data = [{'objectID': '1', 'objectType': 'Test'}]
+ batch_upload_to_dynamodb(data)
+ mock_batch.put_item.assert_called_once_with(Item=data[0])
+
+ @patch('src.functions.transient_data.transient_data.fetch_trains')
+ @patch('src.functions.transient_data.transient_data.fetch_luas')
+ @patch('src.functions.transient_data.transient_data.fetch_buses')
+ @patch('src.functions.transient_data.transient_data.batch_upload_to_dynamodb')
+ def test_lambda_handler_executes_successfully(self, mock_batch_upload, mock_fetch_buses, mock_fetch_luas, mock_fetch_trains):
+ mock_fetch_trains.return_value = [{'objectID': '1', 'objectType': 'Train'}]
+ mock_fetch_luas.return_value = [{'objectID': '2', 'objectType': 'Luas'}]
+ mock_fetch_buses.return_value = [{'objectID': '3', 'objectType': 'Bus'}]
+
+ event = {}
+ context = {}
+ result = lambda_handler(event, context)
+ self.assertEqual(result['statusCode'], 200)
+ self.assertIn('Data uploaded successfully', result['body'])