
    rj                     `    d Z ddlZddlmc mZ ddlmZ g dZ	d Z
d Zd Zd Zd	 Zd
 Zd Zy)u]  
Schema contract tests: verify all 5 required indexes exist.

Uses pytest's `db` fixture (creates schema via db.create_all(), which respects
__table_args__ Index definitions — no migration required for tests).

AR-5: idx_transactions_date, idx_transactions_category, idx_transactions_account,
      idx_bills_due_date, idx_balance_updates_account
    N)text)idx_transactions_dateidx_transactions_categoryidx_transactions_accountidx_bills_due_dateidx_balance_updates_accountc                     | j                  t        d            j                         }|D ch c]  }|d   	 c}S c c}w )z1Query sqlite_master for all user-defined indexes.z1SELECT name FROM sqlite_master WHERE type='index'r   )executer   fetchall)
db_sessionrowsrows      9/var/www/html/financials/tests/test_models/test_schema.py_get_index_namesr      s?    @Ahj 	 ##sCF###s   <c                 h   d}| j                   }t        |      }||v }|s
t        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )	Nr   inzM%(py1)s in %(py8)s
{%(py8)s = %(py3)s(%(py6)s
{%(py6)s = %(py4)s.session
})
}r   dbpy1py3py4py6py8assert %(py10)spy10
sessionr   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationr   @py_assert0@py_assert5@py_assert7@py_assert2@py_format9@py_format11s          r   !test_idx_transactions_date_existsr/      s    "BrzzB&6z&BB"&BBBBB"&BBBB"BBBBBB&6BBB&6BBBBBBrBBBrBBBzBBB&BBBBBBBB    c                 h   d}| j                   }t        |      }||v }|s
t        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )	Nr   r   r   r   r   r   r   r   r   r(   s          r   %test_idx_transactions_category_existsr2   "   s    &F2::F*::*FF&*FFFFF&*FFFF&FFFFFF*:FFF*:FFFFFF2FFF2FFF:FFF*FFFFFFFFr0   c                 h   d}| j                   }t        |      }||v }|s
t        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )	Nr   r   r   r   r   r   r   r   r   r(   s          r   $test_idx_transactions_account_existsr4   &   s    %E"**E)9*)EE%)EEEEE%)EEEE%EEEEEE)9EEE)9EEEEEE"EEE"EEE*EEE)EEEEEEEEr0   c                 h   d}| j                   }t        |      }||v }|s
t        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )	Nr   r   r   r   r   r   r   r   r   r(   s          r   test_idx_bills_due_date_existsr6   *   s    ?BJJ?#3J#??#?????#??????????#3???#3??????B???B???J???#????????r0   c                 h   d}| j                   }t        |      }||v }|s
t        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )	Nr   r   r   r   r   r   r   r   r   r(   s          r   'test_idx_balance_updates_account_existsr8   .   s    (HRZZH,<Z,HH(,HHHHH(,HHHH(HHHHHH,<HHH,<HHHHHHRHHHRHHHZHHH,HHHHHHHHr0   c                    t        | j                        }t        D cg c]	  }||vs| }}g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}}yc c}w )	z0Aggregate: all 5 AR-5 indexes present in schema.)==)z%(py0)s == %(py3)smissing)py0r   zMissing required indexes: z
>assert %(py5)spy5N)r   r   REQUIRED_INDEXESr    r!   r#   r$   r%   r"   _format_assertmsgr&   r'   )r   foundidxr;   r,   @py_assert1@py_format4@py_format6s           r   test_all_required_indexes_existrE   2   s    RZZ(E.Cs#U2BsCGC@7b=@@@7b@@@@@@7@@@7@@@b@@@6wi@@@@@@@ Ds
   	C.C.)__doc__builtinsr#   _pytest.assertion.rewrite	assertionrewriter    
sqlalchemyr   r>   r   r/   r2   r4   r6   r8   rE    r0   r   <module>rM      sE       $CGF@IAr0   