from pathlib import Path import struct import pytest from mywhoosh_garmin_sync.fit_crc import fit_crc from mywhoosh_garmin_sync.fit_device import ( DeviceFieldValue, FitFormatError, GarminDevice, convert_fit_device, read_device_field_values, ) def test_convert_fit_device_patches_metadata_and_crc(tmp_path: Path): source = tmp_path / "source.fit" output = tmp_path / "output.fit" source.write_bytes(_minimal_activity_fit()) result = convert_fit_device( source, output, GarminDevice(product_id=3578, product_name="Edge 1030 Plus", serial_number=42), ) assert result.patched_field_count == 8 values = read_device_field_values(output) assert DeviceFieldValue(0, 1, 1) in values assert DeviceFieldValue(0, 2, 3578) in values assert DeviceFieldValue(0, 3, 42) in values assert DeviceFieldValue(0, 8, "Edge 1030 Plus") in values assert DeviceFieldValue(23, 2, 1) in values assert DeviceFieldValue(23, 3, 42) in values assert DeviceFieldValue(23, 4, 3578) in values assert DeviceFieldValue(23, 27, "Edge 1030 Plus") in values data = output.read_bytes() assert struct.unpack_from(" bytes: data = bytearray() data.extend( _definition( local=0, global_message=0, fields=[ (0, 1, 0x00), (1, 2, 0x84), (2, 2, 0x84), (3, 4, 0x8C), (8, 20, 0x07), ], ) ) data.extend(b"\x00") data.extend(struct.pack(" bytes: result = bytearray() result.append(0x40 | local) result.append(0) result.append(0) result.extend(struct.pack(" bytes: encoded = value.encode("utf-8")[: size - 1] + b"\x00" return encoded + b"\x00" * (size - len(encoded))