============================= test session starts ==============================
platform linux -- Python 3.11.13, pytest-9.0.2, pluggy-1.6.0
django: version: 4.2.27, settings: testproject.settings (from ini)
rootdir: /var/home/josh/github/catalpainternational/formkit-ninja
configfile: pyproject.toml
plugins: django-4.11.1, base-url-2.1.0, cov-7.0.0, playwright-0.7.2, Faker-40.1.2
collected 1 item

tests/test_submission_integration.py DEBUG: Checking config for node: field1 (FormKit: text)
DEBUG: Cache Key: text-field1-
DEBUG: Checking config for node: subfield (FormKit: text)
DEBUG: Cache Key: text-subfield-
DEBUG: Checking config for node: field1 (FormKit: text)
DEBUG: Cache Key: text-field1-
DEBUG: Checking config for node: subfield (FormKit: text)
DEBUG: Cache Key: text-subfield-
DEBUG: Checking config for node: field1 (FormKit: text)
DEBUG: Cache Key: text-field1-
DEBUG: Checking config for node: myrepeater (FormKit: repeater)
DEBUG: Cache Key: repeater-myrepeater-
DEBUG: Checking config for node: field1 (FormKit: text)
DEBUG: Cache Key: text-field1-
DEBUG: Checking config for node: subfield (FormKit: text)
DEBUG: Cache Key: text-subfield-
DEBUG: Checking config for node: subfield (FormKit: text)
DEBUG: Cache Key: text-subfield-
DEBUG: Checking config for node: subfield (FormKit: text)
DEBUG: Cache Key: text-subfield-
DEBUG: Checking config for node: field1 (FormKit: text)
DEBUG: Cache Key: text-field1-
DEBUG: Checking config for node: field1 (FormKit: text)
DEBUG: Cache Key: text-field1-
DEBUG: Checking config for node: subfield (FormKit: text)
DEBUG: Cache Key: text-subfield-
DEBUG: Checking config for node: subfield (FormKit: text)
DEBUG: Cache Key: text-subfield-
DEBUG: Checking config for node: field1 (FormKit: text)
DEBUG: Cache Key: text-field1-
DEBUG: Checking config for node: subfield (FormKit: text)
DEBUG: Cache Key: text-subfield-
F
ERROR: Coverage failure: total of 39.89 is less than fail-under=80.00


=================================== FAILURES ===================================
________________ TestSubmissionIntegration.test_full_lifecycle _________________

self = <tests.test_submission_integration.TestSubmissionIntegration object at 0x7ff9f8fd8310>
tmp_path = PosixPath('/tmp/pytest-of-josh/pytest-60/test_full_lifecycle0')

    def test_full_lifecycle(self, tmp_path):
        # 1. Setup Configuration
        # Root "myform"
        CodeGenerationConfig.objects.create(
            node_name="myform",
            django_type="OneToOneField",
            django_args={
                "to": "formkit_ninja.SeparatedSubmission",
                "on_delete": "models.CASCADE",
                "primary_key": True,
            },
            is_active=True,
            priority=100
        )
        # Repeater "myrepeater"
        CodeGenerationConfig.objects.create(
            node_name="myrepeater",
            django_type="OneToOneField",
            django_args={
                "to": "formkit_ninja.SeparatedSubmission",
                "on_delete": "models.CASCADE",
                "null": True,
            },
            is_active=True,
            priority=100
        )
    
        # 2. Schema
        schema_data = [
            {
                "$formkit": "group",
                "name": "myform",
                "children": [
                    {"$formkit": "text", "name": "field1"},
                    {
                        "$formkit": "repeater",
                        "name": "myrepeater",
                        "children": [
                            {"$formkit": "text", "name": "subfield"}
                        ]
                    }
                ]
            }
        ]
    
        # 3. Generate Code
        output_dir = tmp_path / "models"
        output_dir.mkdir()
    
        config = GeneratorConfig(
            app_name="formkit_ninja",
            output_dir=output_dir,
            node_path_class=DatabaseNodePath
        )
    
        generator = CodeGenerator(
            config=config,
            template_loader=DefaultTemplateLoader(),
            formatter=CodeFormatter(),
        )
        generator.generate(schema_data)
    
        # 4. Load Generated Models
        models_file = output_dir / "models" / "myform.py"
        assert models_file.exists()
    
        generated_models = load_module("formkit_ninja.models.myform", models_file)
    
        Myform = getattr(generated_models, "Myform", None)
        assert Myform is not None
    
        MyformMyrepeater = getattr(generated_models, "MyformMyrepeater", None)
        assert MyformMyrepeater is not None
    
        # Verify 'submission' field existence
>       assert hasattr(Myform, "submission"), "Myform should have 'submission' field from CodeGenerationConfig"
E       AssertionError: Myform should have 'submission' field from CodeGenerationConfig
E       assert False
E        +  where False = hasattr(<class 'formkit_ninja.models.myform.Myform'>, 'submission')

tests/test_submission_integration.py:102: AssertionError
================================ tests coverage ================================
_______________ coverage: platform linux, python 3.11.13-final-0 _______________

Name                                                        Stmts   Miss Branch BrPart   Cover   Missing
--------------------------------------------------------------------------------------------------------
formkit_ninja/__init__.py                                       0      0      0      0 100.00%
formkit_ninja/__main__.py                                       0      0      0      0 100.00%
formkit_ninja/admin.py                                        293    110     68      0  50.69%   40, 43-49, 52-70, 73-87, 90-135, 138-150, 159-161, 164-168, 268, 273, 439-445, 448-449, 452, 455-472, 477-486, 497
formkit_ninja/admin_code_generation.py                         65     32     16      1  41.98%   26->28, 32-48, 98-122, 209-214, 219, 224, 228-239
formkit_ninja/api.py                                          318    318     88      0   0.00%   1-616
formkit_ninja/code_generation_config.py                        41     20     16      0  36.84%   106-111, 115-136
formkit_ninja/fields.py                                        56     56     20      0   0.00%   1-151
formkit_ninja/form_submission/__init__.py                       0      0      0      0 100.00%
formkit_ninja/form_submission/models.py                       127     75     22      0  34.90%   38-44, 49-63, 89-97, 106-168, 216-230, 236-279
formkit_ninja/form_submission/utils.py                        111     89     82      0  11.40%   13-15, 19-21, 25-27, 36-38, 47-56, 60-63, 72-82, 86-91, 100-106, 114-133, 140-142, 152-153, 160-164, 171-177, 185-194, 201-204
formkit_ninja/formkit_schema.py                               279     81     50      1  62.31%   138-139, 371-377, 383-395, 398-401, 404-408, 464-480, 496-572, 585-590
formkit_ninja/management/__init__.py                            0      0      0      0 100.00%
formkit_ninja/management/commands/__init__.py                   0      0      0      0 100.00%
formkit_ninja/management/commands/check_valid_names.py         13     13      4      0   0.00%   1-18
formkit_ninja/management/commands/generate_all_schemas.py      77     77     22      0   0.00%   9-184
formkit_ninja/management/commands/generate_code.py             60     60     18      0   0.00%   8-143
formkit_ninja/management/commands/import_forms.py              17     17      2      0   0.00%   1-23
formkit_ninja/models.py                                       389    239    170      0  26.83%   30-37, 94-101, 104, 114-128, 140-150, 194-196, 199-202, 216-218, 241, 251-262, 296, 305-315, 400, 407-449, 458-466, 480-538, 545-558, 564-697, 700-702, 737-739, 742-743, 746, 749, 757-759, 767-768
formkit_ninja/notifications.py                                 20     20      4      0   0.00%   5-42
formkit_ninja/parser/__init__.py                                8      0      0      0 100.00%
formkit_ninja/parser/converters.py                             97     35     48      9  53.10%   46, 58, 115->123, 119-120, 124-129, 153, 200, 216-226, 248, 264-277, 299, 313, 335, 349, 371, 385
formkit_ninja/parser/converters_examples.py                    22     22      0      0   0.00%   17-136
formkit_ninja/parser/database_node_path.py                    121     54     74     18  45.64%   18, 71->85, 86-101, 104->119, 116-117, 140->148, 143-145, 149-154, 157->164, 160-162, 181, 186, 206, 211, 231, 236-240, 254, 259, 270-279, 292-307
formkit_ninja/parser/formatter.py                              30     19      4      1  35.29%   22-24, 44, 62-87
formkit_ninja/parser/generation_pipeline.py                    25      1      4      1  93.10%   16
formkit_ninja/parser/generator.py                             327    100    164     29  62.32%   66-81, 91-93, 153-155, 176-177, 190-202, 204->181, 210->181, 214-218, 228->181, 235->234, 266, 273-321, 327->332, 342-348, 351->364, 355->359, 359->364, 385->384, 389->421, 397-398, 401->406, 412->411, 416->421, 436-437, 457, 464-466, 474->471, 476->471, 485->484, 493-495, 509-510, 527-528, 533-544, 580-581, 586-601, 641-642, 650, 658
formkit_ninja/parser/generator_config.py                       56     15     22      5  58.97%   22-24, 79, 86, 93, 100-104, 107-111
formkit_ninja/parser/logger.py                                  3      3      0      0   0.00%   1-4
formkit_ninja/parser/node_factory.py                           45     17     16      4  59.02%   33, 68->80, 74-75, 81-91, 107-113
formkit_ninja/parser/node_registry.py                          40      4      4      2  86.36%   14, 47, 69, 81
formkit_ninja/parser/plugins.py                                49     26     10      0  38.98%   43, 57, 71, 96, 105, 117-118, 127-130, 142-146, 177-189, 199
formkit_ninja/parser/schema_walker.py                          42      7     18      2  75.00%   44-47, 68, 78-79
formkit_ninja/parser/template_loader.py                        16      4      0      0  75.00%   32, 80, 89-91
formkit_ninja/parser/type_convert.py                          394    144    202     36  53.36%   22-39, 113-116, 131, 149, 166, 168-173, 182-185, 199-201, 236, 246, 253, 286, 291, 299-302, 313-315, 330, 349, 352-355, 359, 361, 363, 365, 367, 369, 372-378, 385-396, 400, 407, 411, 414-426, 442, 448, 451-469, 482->exit, 483->485, 489-502, 524, 550, 555-558, 569-574, 591, 595-598, 608-610, 654, 666, 705-708, 722-724, 735-737
formkit_ninja/samples/__init__.py                               0      0      0      0 100.00%
formkit_ninja/schemas/__init__.py                              24      8      2      0  61.54%   19, 22, 25, 28, 31-34
formkit_ninja/schemas/schemas.py                                0      0      0      0 100.00%
formkit_ninja/services/__init__.py                              0      0      0      0 100.00%
formkit_ninja/services/schema_import.py                        28     20      8      0  22.22%   20-32, 39-52
formkit_ninja/triggers.py                                      17      0      0      0 100.00%
formkit_ninja/urls.py                                           6      6      0      0   0.00%   1-9
--------------------------------------------------------------------------------------------------------
TOTAL                                                        3216   1692   1158    109  39.89%
Coverage HTML written to dir htmlcov
FAIL Required test coverage of 80.0% not reached. Total coverage: 39.89%
=========================== short test summary info ============================
FAILED tests/test_submission_integration.py::TestSubmissionIntegration::test_full_lifecycle
============================== 1 failed in 1.25s ===============================
