diff --git a/markdown/TEST-REPORT.md b/markdown/TEST-REPORT.md index cc6fa1cbc..f902e4615 100644 --- a/markdown/TEST-REPORT.md +++ b/markdown/TEST-REPORT.md @@ -1,8 +1,8 @@ # ๐Ÿงช Test Report -*Generated on 2025-08-12 22:35:01 CEST* +*Generated on 2025-08-12 22:44:37 CEST* ## ๐Ÿงพ General Info -- **duration**: 4.7898876667022705 +- **duration**: 5.115946292877197 - **root**: /workspace/tligui_y/slic - **environment**: {} @@ -29,7 +29,7 @@ **duration:** ```python - 0.0004974203184247017 + 0.00039944564923644066 ``` **outcome:** @@ -43,7 +43,7 @@ **duration:** ```python - 0.13467674795538187 + 0.14373651891946793 ``` **outcome:** @@ -56,15 +56,15 @@ ```python path: /workspace/tligui_y/slic/tests/test_utils_sendmail.py - lineno: 53 - message: NameError: name 'msg' is not defined + lineno: 56 + message: NameError: name 'from_addr' is not defined ``` **traceback:** ```python - path: tests/test_utils_sendmail.py - lineno: 53 + lineno: 56 message: NameError ``` @@ -82,7 +82,7 @@ body = "Hello from pytest/local!" # Send the email using the function under test - sendmail(to_addr, from_addr=f"{user}@localhost", subject=subject, body=body) + msg = sendmail(to_addr, from_addr=f"{user}@localhost", subject=subject, body=body) # Path to the Maildir 'new' folder for this user maildir_new = os.path.expanduser("~/Maildir/new") @@ -110,10 +110,13 @@ assert subject in content, "Email subject not found in delivered message" assert body in content, "Email body not found in delivered message" - > repr_str = repr(msg) - E NameError: name 'msg' is not defined + repr_str = repr(msg) + assert isinstance(repr_str, str), "__repr__() must return str" + assert f"To: {to_addr}" in repr_str, "To header missing from __repr__()" + > assert f"From: {from_addr}" in repr_str, "From header missing from __repr__()" + E NameError: name 'from_addr' is not defined - tests/test_utils_sendmail.py:53: NameError + tests/test_utils_sendmail.py:56: NameError ``` **_*๐Ÿ“Œ Teardown phase*_** @@ -121,7 +124,7 @@ **duration:** ```python - 0.00036546308547258377 + 0.00039704982191324234 ``` **outcome:** @@ -149,7 +152,7 @@ **duration:** ```python - 0.00042511802166700363 + 0.00048598507419228554 ``` **outcome:** @@ -163,7 +166,7 @@ **duration:** ```python - 0.0009083142504096031 + 0.0009725349955260754 ``` **outcome:** @@ -177,7 +180,7 @@ **duration:** ```python - 0.00017098616808652878 + 0.00017899135127663612 ``` **outcome:** diff --git a/markdown/coverage-summary.md b/markdown/coverage-summary.md index 95c76c7ae..e25707a83 100644 --- a/markdown/coverage-summary.md +++ b/markdown/coverage-summary.md @@ -15780,3 +15780,228 @@ | slic/utils/utils.py | 17 | 8 | 53% | | slic/utils/xrange.py | 33 | 30 | 9% | | **TOTAL** | **9529** | **6953** | **27%** | +| Name | Stmts | Miss | Cover | +|----------------------------------------------- | -------: | -------: | ------: | +| slic/\_\_init\_\_.py | 20 | 2 | 90% | +| slic/core/\_\_init\_\_.py | 5 | 0 | 100% | +| slic/core/acquisition/\_\_init\_\_.py | 7 | 0 | 100% | +| slic/core/acquisition/acquisition.py | 56 | 42 | 25% | +| slic/core/acquisition/baseacquisition.py | 5 | 1 | 80% | +| slic/core/acquisition/broker/\_\_init\_\_.py | 2 | 0 | 100% | +| slic/core/acquisition/broker/brokerclient.py | 104 | 80 | 23% | +| slic/core/acquisition/broker/brokerconfig.py | 102 | 87 | 15% | +| slic/core/acquisition/broker/pedestal.py | 66 | 57 | 14% | +| slic/core/acquisition/broker/pids.py | 17 | 12 | 29% | +| slic/core/acquisition/broker/post\_retrieve.py | 120 | 120 | 0% | +| slic/core/acquisition/broker/requeststatus.py | 77 | 73 | 5% | +| slic/core/acquisition/broker/restapi.py | 147 | 107 | 27% | +| slic/core/acquisition/broker/tools.py | 52 | 18 | 65% | +| slic/core/acquisition/bsacquisition.py | 10 | 3 | 70% | +| slic/core/acquisition/bschannels.py | 30 | 19 | 37% | +| slic/core/acquisition/channels.py | 51 | 30 | 41% | +| slic/core/acquisition/dbacquisition.py | 19 | 12 | 37% | +| slic/core/acquisition/detcfg.py | 82 | 35 | 57% | +| slic/core/acquisition/diaacquisition.py | 111 | 111 | 0% | +| slic/core/acquisition/diaconfig.py | 36 | 36 | 0% | +| slic/core/acquisition/dummyacquisition.py | 12 | 12 | 0% | +| slic/core/acquisition/fakeacquisition.py | 76 | 53 | 30% | +| slic/core/acquisition/pedestals.py | 69 | 69 | 0% | +| slic/core/acquisition/pvacquisition.py | 60 | 47 | 22% | +| slic/core/acquisition/pvchannels.py | 13 | 7 | 46% | +| slic/core/acquisition/sfacquisition.py | 159 | 129 | 19% | +| slic/core/acquisition/sfpaths.py | 23 | 19 | 17% | +| slic/core/acquisition/spreadsheet.py | 45 | 45 | 0% | +| slic/core/adjustable/\_\_init\_\_.py | 11 | 0 | 100% | +| slic/core/adjustable/adjustable.py | 50 | 30 | 40% | +| slic/core/adjustable/baseadjustable.py | 28 | 18 | 36% | +| slic/core/adjustable/collection.py | 22 | 14 | 36% | +| slic/core/adjustable/combined.py | 15 | 8 | 47% | +| slic/core/adjustable/convenience.py | 35 | 20 | 43% | +| slic/core/adjustable/converted.py | 16 | 10 | 38% | +| slic/core/adjustable/dummyadjustable.py | 41 | 30 | 27% | +| slic/core/adjustable/error.py | 2 | 0 | 100% | +| slic/core/adjustable/genericadjustable.py | 32 | 24 | 25% | +| slic/core/adjustable/limited.py | 29 | 18 | 38% | +| slic/core/adjustable/linked.py | 22 | 15 | 32% | +| slic/core/adjustable/pvadjustable.py | 119 | 91 | 24% | +| slic/core/adjustable/pvchangemon.py | 77 | 56 | 27% | +| slic/core/adjustable/pvenumadjustable.py | 38 | 22 | 42% | +| slic/core/adjustable/scaler.py | 22 | 16 | 27% | +| slic/core/condition/\_\_init\_\_.py | 2 | 0 | 100% | +| slic/core/condition/basecondition.py | 8 | 2 | 75% | +| slic/core/condition/condition.py | 107 | 79 | 26% | +| slic/core/condition/pvcondition.py | 21 | 12 | 43% | +| slic/core/condition/valuecondition.py | 22 | 15 | 32% | +| slic/core/device/\_\_init\_\_.py | 2 | 0 | 100% | +| slic/core/device/auto.py | 12 | 12 | 0% | +| slic/core/device/basedevice.py | 2 | 0 | 100% | +| slic/core/device/device.py | 46 | 35 | 24% | +| slic/core/device/filtered.py | 23 | 23 | 0% | +| slic/core/device/simpledevice.py | 6 | 2 | 67% | +| slic/core/scanner/\_\_init\_\_.py | 1 | 0 | 100% | +| slic/core/scanner/runname.py | 36 | 23 | 36% | +| slic/core/scanner/scanbackend.py | 232 | 197 | 15% | +| slic/core/scanner/scaninfo.py | 45 | 35 | 22% | +| slic/core/scanner/scanner.py | 136 | 89 | 35% | +| slic/core/sensor/\_\_init\_\_.py | 8 | 0 | 100% | +| slic/core/sensor/basesensor.py | 12 | 3 | 75% | +| slic/core/sensor/bscombined.py | 9 | 5 | 44% | +| slic/core/sensor/bsmonitor.py | 102 | 73 | 28% | +| slic/core/sensor/bsnorm.py | 12 | 7 | 42% | +| slic/core/sensor/bssensor.py | 6 | 2 | 67% | +| slic/core/sensor/combined.py | 31 | 20 | 35% | +| slic/core/sensor/monitor.py | 62 | 51 | 18% | +| slic/core/sensor/norm.py | 9 | 5 | 44% | +| slic/core/sensor/pvsensor.py | 32 | 20 | 38% | +| slic/core/sensor/remoteplot.py | 15 | 10 | 33% | +| slic/core/sensor/sensor.py | 60 | 42 | 30% | +| slic/core/task/\_\_init\_\_.py | 4 | 0 | 100% | +| slic/core/task/basetask.py | 11 | 3 | 73% | +| slic/core/task/daqtask.py | 23 | 16 | 30% | +| slic/core/task/loop.py | 57 | 40 | 30% | +| slic/core/task/producer.py | 25 | 18 | 28% | +| slic/core/task/task.py | 62 | 46 | 26% | +| slic/devices/\_\_init\_\_.py | 7 | 0 | 100% | +| slic/devices/cameras/\_\_init\_\_.py | 4 | 0 | 100% | +| slic/devices/cameras/basler.py | 8 | 4 | 50% | +| slic/devices/cameras/camera\_bs.py | 13 | 8 | 38% | +| slic/devices/cameras/camera\_ca.py | 34 | 19 | 44% | +| slic/devices/cameras/camerabase.py | 17 | 12 | 29% | +| slic/devices/cameras/screenpanel.py | 31 | 21 | 32% | +| slic/devices/endstations/\_\_init\_\_.py | 3 | 0 | 100% | +| slic/devices/endstations/alvra\_flex.py | 10 | 5 | 50% | +| slic/devices/endstations/alvra\_huber.py | 8 | 4 | 50% | +| slic/devices/endstations/alvra\_prime.py | 48 | 34 | 29% | +| slic/devices/endstations/alvra\_xtg.py | 8 | 8 | 0% | +| slic/devices/endstations/bernina\_cameras.py | 33 | 33 | 0% | +| slic/devices/endstations/bernina\_platform.py | 46 | 46 | 0% | +| slic/devices/general/\_\_init\_\_.py | 4 | 0 | 100% | +| slic/devices/general/delay\_compensation.py | 13 | 13 | 0% | +| slic/devices/general/delay\_stage.py | 57 | 30 | 47% | +| slic/devices/general/detectors/\_\_init\_\_.py | 2 | 0 | 100% | +| slic/devices/general/detectors/buffer.py | 66 | 35 | 47% | +| slic/devices/general/detectors/digitizer.py | 13 | 7 | 46% | +| slic/devices/general/detectors/pvdatastream.py | 33 | 24 | 27% | +| slic/devices/general/detectors/timer.py | 15 | 9 | 40% | +| slic/devices/general/micosstage.py | 7 | 7 | 0% | +| slic/devices/general/motor.py | 128 | 88 | 31% | +| slic/devices/general/shutter.py | 22 | 12 | 45% | +| slic/devices/general/shutterctx.py | 18 | 7 | 61% | +| slic/devices/general/smaract.py | 169 | 125 | 26% | +| slic/devices/loptics/\_\_init\_\_.py | 2 | 0 | 100% | +| slic/devices/loptics/alvra\_explaser.py | 29 | 21 | 28% | +| slic/devices/loptics/bernina\_explaser.py | 28 | 28 | 0% | +| slic/devices/loptics/lasershutter.py | 22 | 14 | 36% | +| slic/devices/timing/\_\_init\_\_.py | 0 | 0 | 100% | +| slic/devices/timing/events/\_\_init\_\_.py | 3 | 3 | 0% | +| slic/devices/timing/events/codes.py | 5 | 5 | 0% | +| slic/devices/timing/events/ctaseq.py | 190 | 190 | 0% | +| slic/devices/timing/events/evr.py | 37 | 37 | 0% | +| slic/devices/timing/events/tma.py | 40 | 40 | 0% | +| slic/devices/timing/lasertiming.py | 253 | 184 | 27% | +| slic/devices/xdiagnostics/\_\_init\_\_.py | 2 | 0 | 100% | +| slic/devices/xdiagnostics/intensitymonitor.py | 124 | 92 | 26% | +| slic/devices/xdiagnostics/profilemonitor.py | 19 | 9 | 53% | +| slic/devices/xdiagnostics/timetools.py | 48 | 48 | 0% | +| slic/devices/xoptics/\_\_init\_\_.py | 7 | 0 | 100% | +| slic/devices/xoptics/aramis\_attenuator.py | 96 | 66 | 31% | +| slic/devices/xoptics/aramis\_reflaser.py | 23 | 15 | 35% | +| slic/devices/xoptics/dcm.py | 211 | 162 | 23% | +| slic/devices/xoptics/kb.py | 30 | 18 | 40% | +| slic/devices/xoptics/offsetmirrors.py | 9 | 5 | 44% | +| slic/devices/xoptics/pulsepicker.py | 56 | 34 | 39% | +| slic/devices/xoptics/slits/\_\_init\_\_.py | 5 | 0 | 100% | +| slic/devices/xoptics/slits/slitblades.py | 66 | 48 | 27% | +| slic/devices/xoptics/slits/slittwinunit.py | 12 | 6 | 50% | +| slic/devices/xoptics/slits/slitunit.py | 14 | 8 | 43% | +| slic/devices/xoptics/slits/slitunitcw.py | 7 | 3 | 57% | +| slic/devices/xoptics/slits/slitunitjj.py | 8 | 5 | 38% | +| slic/gui/\_\_init\_\_.py | 1 | 0 | 100% | +| slic/gui/daqframe.py | 75 | 54 | 28% | +| slic/gui/daqpanels/\_\_init\_\_.py | 6 | 0 | 100% | +| slic/gui/daqpanels/config.py | 98 | 80 | 18% | +| slic/gui/daqpanels/goto.py | 92 | 76 | 17% | +| slic/gui/daqpanels/run.py | 56 | 46 | 18% | +| slic/gui/daqpanels/scan2d.py | 77 | 66 | 14% | +| slic/gui/daqpanels/scan.py | 63 | 54 | 14% | +| slic/gui/daqpanels/sfx.py | 77 | 60 | 22% | +| slic/gui/daqpanels/special.py | 63 | 54 | 14% | +| slic/gui/daqpanels/static.py | 46 | 37 | 20% | +| slic/gui/daqpanels/tools.py | 140 | 114 | 19% | +| slic/gui/daqpanels/tweak.py | 149 | 127 | 15% | +| slic/gui/gui.py | 16 | 10 | 38% | +| slic/gui/icon.py | 8 | 4 | 50% | +| slic/gui/persist.py | 68 | 48 | 29% | +| slic/gui/widgets/\_\_init\_\_.py | 11 | 0 | 100% | +| slic/gui/widgets/alarm.py | 21 | 9 | 57% | +| slic/gui/widgets/alternative.py | 51 | 40 | 22% | +| slic/gui/widgets/boxes.py | 33 | 26 | 21% | +| slic/gui/widgets/checkbox.py | 8 | 4 | 50% | +| slic/gui/widgets/completers.py | 27 | 19 | 30% | +| slic/gui/widgets/dyncombo.py | 49 | 49 | 0% | +| slic/gui/widgets/entries.py | 253 | 195 | 23% | +| slic/gui/widgets/exc2warn.py | 15 | 13 | 13% | +| slic/gui/widgets/fname.py | 60 | 47 | 22% | +| slic/gui/widgets/jfcfg.py | 290 | 230 | 21% | +| slic/gui/widgets/jfmodcoords.py | 88 | 70 | 20% | +| slic/gui/widgets/labeled.py | 19 | 7 | 63% | +| slic/gui/widgets/lists.py | 96 | 73 | 24% | +| slic/gui/widgets/mods.py | 25 | 17 | 32% | +| slic/gui/widgets/nope.py | 26 | 19 | 27% | +| slic/gui/widgets/plotting.py | 68 | 47 | 31% | +| slic/gui/widgets/tools.py | 11 | 7 | 36% | +| slic/gui/widgets/twobuttons.py | 43 | 30 | 30% | +| slic/gui/wxdebug.py | 15 | 7 | 53% | +| slic/utils/\_\_init\_\_.py | 24 | 0 | 100% | +| slic/utils/argfwd.py | 53 | 14 | 74% | +| slic/utils/ask\_yes\_no.py | 27 | 20 | 26% | +| slic/utils/channels.py | 17 | 12 | 29% | +| slic/utils/config.py | 5 | 2 | 60% | +| slic/utils/cprint.py | 41 | 16 | 61% | +| slic/utils/dbusnotify.py | 40 | 25 | 38% | +| slic/utils/debug.py | 16 | 12 | 25% | +| slic/utils/dictext.py | 30 | 19 | 37% | +| slic/utils/dotdir.py | 10 | 1 | 90% | +| slic/utils/duo.py | 77 | 45 | 42% | +| slic/utils/elog.py | 31 | 21 | 32% | +| slic/utils/eval.py | 49 | 37 | 24% | +| slic/utils/exceptions.py | 22 | 14 | 36% | +| slic/utils/get\_adj.py | 17 | 11 | 35% | +| slic/utils/hastyepics.py | 37 | 25 | 32% | +| slic/utils/ioc/\_\_init\_\_.py | 1 | 1 | 0% | +| slic/utils/ioc/adjdrv.py | 31 | 31 | 0% | +| slic/utils/ioc/ioc.py | 63 | 63 | 0% | +| slic/utils/ipy.py | 22 | 15 | 32% | +| slic/utils/jsonext.py | 24 | 16 | 33% | +| slic/utils/lazypv.py | 12 | 12 | 0% | +| slic/utils/logcfg.py | 52 | 2 | 96% | +| slic/utils/logign.py | 22 | 14 | 36% | +| slic/utils/marker.py | 48 | 31 | 35% | +| slic/utils/metaclasses.py | 8 | 0 | 100% | +| slic/utils/namespace.py | 5 | 1 | 80% | +| slic/utils/npy.py | 71 | 56 | 21% | +| slic/utils/opmsg.py | 122 | 122 | 0% | +| slic/utils/path.py | 32 | 24 | 25% | +| slic/utils/picklio.py | 7 | 3 | 57% | +| slic/utils/printing.py | 77 | 61 | 21% | +| slic/utils/pv.py | 30 | 20 | 33% | +| slic/utils/pvpreload.py | 50 | 19 | 62% | +| slic/utils/pyepics.py | 64 | 39 | 39% | +| slic/utils/rangebar.py | 92 | 61 | 34% | +| slic/utils/readable.py | 12 | 9 | 25% | +| slic/utils/registry.py | 33 | 19 | 42% | +| slic/utils/reprate.py | 55 | 42 | 24% | +| slic/utils/richcfg.py | 21 | 11 | 48% | +| slic/utils/run\_later.py | 64 | 64 | 0% | +| slic/utils/screenshot.py | 30 | 21 | 30% | +| slic/utils/sendmail.py | 49 | 2 | 96% | +| slic/utils/sendsms.py | 5 | 5 | 0% | +| slic/utils/shortcut.py | 38 | 20 | 47% | +| slic/utils/snapshot.py | 6 | 3 | 50% | +| slic/utils/termtitle.py | 3 | 0 | 100% | +| slic/utils/tqdm\_mod.py | 28 | 18 | 36% | +| slic/utils/trinary.py | 4 | 2 | 50% | +| slic/utils/typecast.py | 19 | 19 | 0% | +| slic/utils/utils.py | 17 | 8 | 53% | +| slic/utils/xrange.py | 33 | 30 | 9% | +| **TOTAL** | **9529** | **6952** | **27%** | diff --git a/markdown/pytest-report.json b/markdown/pytest-report.json index 519f381ea..f9e6c94d3 100644 --- a/markdown/pytest-report.json +++ b/markdown/pytest-report.json @@ -1 +1 @@ -{"created": 1755030900.0678556, "duration": 4.7898876667022705, "exitcode": 1, "root": "/workspace/tligui_y/slic", "environment": {}, "summary": {"failed": 1, "passed": 1, "total": 2, "collected": 2}, "collectors": [{"nodeid": "", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_sendmail.py", "type": "Module"}]}, {"nodeid": "tests/test_utils_sendmail.py", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_sendmail.py::test_sendmail_local_delivery", "type": "Function", "lineno": 13}, {"nodeid": "tests/test_utils_sendmail.py::test_sendmail_raises_on_sendmail_failure", "type": "Function", "lineno": 59}]}], "tests": [{"nodeid": "tests/test_utils_sendmail.py::test_sendmail_local_delivery", "lineno": 13, "outcome": "failed", "keywords": ["test_sendmail_local_delivery", "test_utils_sendmail.py", "tests", "slic", ""], "setup": {"duration": 0.0004974203184247017, "outcome": "passed"}, "call": {"duration": 0.13467674795538187, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/tests/test_utils_sendmail.py", "lineno": 53, "message": "NameError: name 'msg' is not defined"}, "traceback": [{"path": "tests/test_utils_sendmail.py", "lineno": 53, "message": "NameError"}], "longrepr": "def test_sendmail_local_delivery():\n \n # Get the current system user\n user = getpass.getuser()\n \n # Define the recipient and email content\n to_addr = f\"{user}@localhost\"\n subject = \"Local sendmail test\"\n body = \"Hello from pytest/local!\"\n \n # Send the email using the function under test\n sendmail(to_addr, from_addr=f\"{user}@localhost\", subject=subject, body=body)\n \n # Path to the Maildir 'new' folder for this user\n maildir_new = os.path.expanduser(\"~/Maildir/new\")\n \n # Clean up the mail\n for f in glob.glob(os.path.join(maildir_new, \"*\")):\n os.remove(f)\n \n # Wait a short time for delivery\n files = []\n for _ in range(50): # Try for ~5 seconds\n time.sleep(0.1)\n files = sorted(glob.glob(os.path.join(maildir_new, \"*\")))\n if files:\n break\n \n # Assert that at least one mail file was delivered\n assert files, f\"No email was delivered to {maildir_new}\"\n \n # Read the most recent mail file\n with open(files[-1], \"r\", encoding=\"utf-8\", errors=\"replace\") as f:\n content = f.read()\n \n # Assert that both the subject and body appear in the delivered email\n assert subject in content, \"Email subject not found in delivered message\"\n assert body in content, \"Email body not found in delivered message\"\n \n> repr_str = repr(msg)\nE NameError: name 'msg' is not defined\n\ntests/test_utils_sendmail.py:53: NameError"}, "teardown": {"duration": 0.00036546308547258377, "outcome": "passed"}}, {"nodeid": "tests/test_utils_sendmail.py::test_sendmail_raises_on_sendmail_failure", "lineno": 59, "outcome": "passed", "keywords": ["test_sendmail_raises_on_sendmail_failure", "test_utils_sendmail.py", "tests", "slic", ""], "setup": {"duration": 0.00042511802166700363, "outcome": "passed"}, "call": {"duration": 0.0009083142504096031, "outcome": "passed"}, "teardown": {"duration": 0.00017098616808652878, "outcome": "passed"}}], "warnings": [{"message": "invalid escape sequence \\-", "category": "DeprecationWarning", "when": "collect", "filename": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/bsread/h5.py", "lineno": 207}, {"message": "The module numpy.dual is deprecated. Instead of using dual, use the functions directly from numpy or scipy.", "category": "DeprecationWarning", "when": "collect", "filename": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/scipy/fft/__init__.py", "lineno": 97}]} \ No newline at end of file +{"created": 1755031475.5235498, "duration": 5.115946292877197, "exitcode": 1, "root": "/workspace/tligui_y/slic", "environment": {}, "summary": {"failed": 1, "passed": 1, "total": 2, "collected": 2}, "collectors": [{"nodeid": "", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_sendmail.py", "type": "Module"}]}, {"nodeid": "tests/test_utils_sendmail.py", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_sendmail.py::test_sendmail_local_delivery", "type": "Function", "lineno": 13}, {"nodeid": "tests/test_utils_sendmail.py::test_sendmail_raises_on_sendmail_failure", "type": "Function", "lineno": 59}]}], "tests": [{"nodeid": "tests/test_utils_sendmail.py::test_sendmail_local_delivery", "lineno": 13, "outcome": "failed", "keywords": ["test_sendmail_local_delivery", "test_utils_sendmail.py", "tests", "slic", ""], "setup": {"duration": 0.00039944564923644066, "outcome": "passed"}, "call": {"duration": 0.14373651891946793, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/tests/test_utils_sendmail.py", "lineno": 56, "message": "NameError: name 'from_addr' is not defined"}, "traceback": [{"path": "tests/test_utils_sendmail.py", "lineno": 56, "message": "NameError"}], "longrepr": "def test_sendmail_local_delivery():\n \n # Get the current system user\n user = getpass.getuser()\n \n # Define the recipient and email content\n to_addr = f\"{user}@localhost\"\n subject = \"Local sendmail test\"\n body = \"Hello from pytest/local!\"\n \n # Send the email using the function under test\n msg = sendmail(to_addr, from_addr=f\"{user}@localhost\", subject=subject, body=body)\n \n # Path to the Maildir 'new' folder for this user\n maildir_new = os.path.expanduser(\"~/Maildir/new\")\n \n # Clean up the mail\n for f in glob.glob(os.path.join(maildir_new, \"*\")):\n os.remove(f)\n \n # Wait a short time for delivery\n files = []\n for _ in range(50): # Try for ~5 seconds\n time.sleep(0.1)\n files = sorted(glob.glob(os.path.join(maildir_new, \"*\")))\n if files:\n break\n \n # Assert that at least one mail file was delivered\n assert files, f\"No email was delivered to {maildir_new}\"\n \n # Read the most recent mail file\n with open(files[-1], \"r\", encoding=\"utf-8\", errors=\"replace\") as f:\n content = f.read()\n \n # Assert that both the subject and body appear in the delivered email\n assert subject in content, \"Email subject not found in delivered message\"\n assert body in content, \"Email body not found in delivered message\"\n \n repr_str = repr(msg)\n assert isinstance(repr_str, str), \"__repr__() must return str\"\n assert f\"To: {to_addr}\" in repr_str, \"To header missing from __repr__()\"\n> assert f\"From: {from_addr}\" in repr_str, \"From header missing from __repr__()\"\nE NameError: name 'from_addr' is not defined\n\ntests/test_utils_sendmail.py:56: NameError"}, "teardown": {"duration": 0.00039704982191324234, "outcome": "passed"}}, {"nodeid": "tests/test_utils_sendmail.py::test_sendmail_raises_on_sendmail_failure", "lineno": 59, "outcome": "passed", "keywords": ["test_sendmail_raises_on_sendmail_failure", "test_utils_sendmail.py", "tests", "slic", ""], "setup": {"duration": 0.00048598507419228554, "outcome": "passed"}, "call": {"duration": 0.0009725349955260754, "outcome": "passed"}, "teardown": {"duration": 0.00017899135127663612, "outcome": "passed"}}], "warnings": [{"message": "invalid escape sequence \\-", "category": "DeprecationWarning", "when": "collect", "filename": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/bsread/h5.py", "lineno": 207}, {"message": "The module numpy.dual is deprecated. Instead of using dual, use the functions directly from numpy or scipy.", "category": "DeprecationWarning", "when": "collect", "filename": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/scipy/fft/__init__.py", "lineno": 97}]} \ No newline at end of file