
    Yaj                        d dl mZ d dlZd dlmc mZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZmZmZmZ d dlmZmZmZ d d	lmZ d d
lmZmZ d ZddZddZ ddZ!ddZ"ddZ#dS )    )annotationsN)
TestClient)get_db)
create_app)analyze_budget_workbook_rows)confirm_create_tagcreate_tag_previewarchive_tag	list_tags)confirm_budget_plan_itemcreate_budget_plan_item_previewlist_budget_plan_items)connect_memory)apply_migrationsget_schema_versionc                 @    t                      } t          |            | S N)r   r   conns    \/home/agent/.hermes/worktrees/FinanceManager-test-baseline/tests/unit/test_budget_phase11.pydbr      s     DTK    returnNonec                 4   t                      } t          |           }d}||k    }|st          j        d|fd||f          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}}d	 | 
                    d
          D             }h d}|j        } ||          }|sdt          j        |          t          j        |          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }t          t          j	        |                    d x}x}}d | 
                    d          D             }|d         }|j        } |            }d}	||	k    }
|
st          j        d|
fd||	f          t          j        |          t          j        |          t          j        |          t          j        |	          dz  }dd|iz  }t          t          j	        |                    d x}x}x}x}
}	|d         }|j        } |            }d}	||	k    }
|
st          j        d|
fd||	f          t          j        |          t          j        |          t          j        |          t          j        |	          dz  }dd|iz  }t          t          j	        |                    d x}x}x}x}
}	d S )N&   ==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   r   )py0py1py3py6assert %(py8)spy8c                    h | ]
}|d          S )name .0rows     r   	<setcomp>zMtest_budget_phase11_tables_tags_and_plan_items_are_created.<locals>.<setcomp>   s    gggcc&kgggr   z1SELECT name FROM sqlite_master WHERE type='table'>   budget_plan_itemsbudget_excel_seed_dry_runsbudget_excel_seed_candidateszJassert %(py6)s
{%(py6)s = %(py3)s
{%(py3)s = %(py1)s.issubset
}(%(py4)s)
}tablesr    r!   py4r"   c                ,    i | ]}|d          |d         S )r&   typer'   r(   s     r   
<dictcomp>zNtest_budget_phase11_tables_tags_and_plan_items_are_created.<locals>.<dictcomp>   s"    eeeCKVeeer   z$PRAGMA table_info(budget_plan_items)monthly_amount_chfTEXT)zD%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.upper
}()
} == %(py8)s)r    r!   py5r$   zassert %(py10)spy10annual_amount_chf)r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationexecuteissubsetupper)r   @py_assert2@py_assert5@py_assert4@py_format7@py_format9r/   @py_assert0cols@py_assert7@py_assert6@py_format11s               r   :test_budget_phase11_tables_tags_and_plan_items_are_createdrO      s   44Dd##)r)#r))))))))))#r))))))))))))))))))))))))))))))d)))))d))))))#))))r)))))))))))))))))))))))))))ggT\\2e%f%fgggF^^^o^gogghnoooooooo^oooogooooooooooohnooooohnooooooooooooooooooooooooooooee=c0d0deeeD$%7%+7++--77-7777777777-77777%7777+7777-77777777777777777777777777777777777#$6$*6**,,66,6666666666,66666$6666*6666,6666666666666666666666666666666666666r   c                    t                      } t          | ddd          }|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd	|iz  }t          t          j        |                    d x}x}}t          | |d
                   }|d         }d t          |           D             }	t          |	          }|sddt          j                    v st          j        t                    rt          j        t                    ndt          j        |	          t          j        |          dz  }t          t          j        |                    d x}	}t          | |          }
|
d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd	|iz  }t          t          j        |                    d x}x}}|                     d                                          d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd	|iz  }t          t          j        |                    d x}x}}d S )NSynthetischer Tagz#00ffee)r&   colorsummaryr   z%(py1)s == %(py4)sr    r1   assert %(py6)sr"   payload	entity_idc              3  >   K   | ]}|d          dk    o|d         V  dS )r&   rQ   	is_activeNr'   )r)   ts     r   	<genexpr>z>test_tags_preview_confirm_archive_and_audit.<locals>.<genexpr>$   s5      \\qqy//BAkN\\\\\\r   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r   py2r1   statusarchivedz=SELECT COUNT(*) FROM audit_log WHERE entity_type='budget_tag'r      )r   r	   r:   r;   r?   r@   rA   r   r   r]   r<   r=   r>   r
   rB   fetchone)r   previewrJ   @py_assert3rE   @py_format5rH   	confirmedtag_id@py_assert1r`   s              r   +test_tags_preview_confirm_archive_and_auditri      s0   44D 0Ci'X'XYYG94!44!44444444444!4444444444!4444444444444444444444444444"4);<<I{#F\\IVZOO\\\\3\\\\\\\\\\\\\\\\3\\\\\3\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\4((HH++++++++++++++++++++++++++++++++++++++++++++++++<<WXXaaccdefkjkkfjkkkkkkkkkkkfjkkkkkkfkkkkjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkr   c                    t                      } |                     d                                          d         }t          | d|dddddd	          }|d
         d         }d}||k    }|slt	          j        d|fd||f          t	          j        |          t	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}x}}t          | |d
                   }|d         }	|                     d|	f                                          }
|
d         }d}||k    }|slt	          j        d|fd||f          t	          j        |          t	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}x}}|
d         }||k    }|st	          j        d|fd||f          t	          j        |          dt          j                    v st	          j        |          rt	          j        |          nddz  }dd|iz  }t          t	          j        |                    d x}}t          | d          d         d         }d}||k    }|slt	          j        d|fd||f          t	          j        |          t	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}x}}d S )Nz=SELECT category_id FROM budget_categories WHERE name='Wohnen'r   2026-05zSynthetische Planpositionz123.45z1481.40Tmonthly)
plan_monthcategory_idr&   r5   r9   is_fixed_costcadencerW   r5   r   rT   rU   rV   r"   rX   zZSELECT typeof(monthly_amount_chf), category_id FROM budget_plan_items WHERE plan_item_id=?text   )z%(py1)s == %(py3)srn   )r    r!   zassert %(py5)sr7   )monthcategory_nameWohnen)r   rB   rb   r   r:   r;   r?   r@   rA   r   r<   r=   r>   r   )r   rn   rc   rJ   rd   rE   re   rH   rf   item_idr*   @py_format4@py_format6s                r   ?test_budget_plan_preview_confirm_decimal_text_and_category_linkry   *   s   44D,,^__hhjjklmK-d"+&&5 5  G 923?x?3x??????????3x?????3????x???????????????????????????(wy/ABBI$G
,,sv}u  A  A  J  J  L  LCq6V6V6V6Vq6 6[          6[     6           [     [                           !$i888;OLXPXXLPXXXXXXXXXXXLPXXXXXXLXXXXPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   c            
     r   t                      t                      } fd}|| j        t          <   t	          |           }|                    dddi          }|j        }d}||k    }|st          j        d|fd||f          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}}|                    d|                                d                   }	|	j        }d}||k    }|st          j        d|fd||f          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}}|j        }d|	                                d          d}i }
 |||
          }|j        }d}||k    }|st          j        d|fd||f          dt          j
                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          t          j        |
          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}
x}x}x}}                    d                                          d         }|                    dd|ddd          }|j        }d}||k    }|st          j        d|fd||f          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}}|j        }d }|                                d         }
 |||
          }|j        }d}||k    }|st          j        d|fd||f          dt          j
                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          t          j        |
          t          j        |          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}
x}x}x}}|j        }d!} ||          }
|
j        }d}||k    }|st          j        d|fd"||f          dt          j
                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          t          j        |
          t          j        |          t          j        |          d#z  }d$d%|iz  }t          t          j        |                    d x}x}x}
x}x}}d S )&Nc               3     K    V  d S r   r'   r   s   r   override_dbz;test_budget_phase11_api_tags_and_plans.<locals>.override_dbC   s      




r   z/api/budget/tags/previewr&   zAPI Tag)json   r   )z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)stag_preview)r   r^   r7   zassert %(py7)spy7z/api/budget/tags/confirmrW   tag_confirmz/api/budget/tags/rX   z/archive)z|%(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.post
}(%(py4)s, json=%(py6)s)
}.status_code
} == %(py13)sclient)r   r^   r1   r"   r$   r8   py13zassert %(py15)spy15z1SELECT category_id FROM budget_categories LIMIT 1r   z/api/budget/plans/previewrk   zAPI Planz10.00)rm   rn   r&   r5   plan_previewz/api/budget/plans/confirmz/api/budget/plans?month=2026-05)zk%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
}.status_code
} == %(py11)s)r   r^   r1   r"   r$   py11zassert %(py13)sr   )r   r   dependency_overridesr   r   poststatus_coder:   r;   r<   r=   r>   r?   r@   rA   r}   rB   rb   get)appr|   r   r   rh   rG   rd   rx   @py_format8r   rF   rL   @py_assert9@py_assert12@py_assert11@py_format14@py_format16rn   r   @py_assert10@py_format12r   s                        @r   &test_budget_phase11_api_tags_and_plansr   ?   s   44D
,,C     (3CV$__F++8	?R+SSK")c)"c))))))))))"c))))))))))));)))));))))))"))))c)))))))))))))))))))))))))))++8{?O?O?Q?QR[?\+]]K")c)"c))))))))))"c))))))))))));)))));))))))"))))c)))))))))))))))))))))))))));qT;+;+;+=+=k+JTTTq[]q;;T[]^^^q^jqnqqjnqqqqqqqqqqqjnqqqqqqqqqqqqq6qqqqq6qqqqqq;qqqqTqqqq[]qqqq^qqqqjqqqqnqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq,,RSS\\^^_`aK;;:PYju  @J  bi  Bj  Bj;  k  kL#*s*#s**********#s************<*****<******#****s***************************;k2k9J9J9L9LY9Wk;;29WXXXkXdkhkkdhkkkkkkkkkkkdhkkkkkkkkkkkkk6kkkkk6kkkkkk;kkkk2kkkk9WkkkkXkkkkdkkkkhkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk:K7K::788K8DKKDKKKKKKKKKKDKKKKKKKKKKKK6KKKKK6KKKKKK:KKKK7KKKK8KKKKDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKr   c                    ddggg dg dg dgd} t          |           }|d         }d}||k    }|slt          j        d	|fd
||f          t          j        |          t          j        |          dz  }dd|iz  }t	          t          j        |                    d x}x}}|d         }d}||k    }|slt          j        d	|fd
||f          t          j        |          t          j        |          dz  }dd|iz  }t	          t          j        |                    d x}x}}|d         }d}||k    }|slt          j        d	|fd
||f          t          j        |          t          j        |          dz  }dd|iz  }t	          t          j        |                    d x}x}}|d         }d}||k    }|slt          j        d	|fd
||f          t          j        |          t          j        |          dz  }dd|iz  }t	          t          j        |                    d x}x}}|d         }d}||k    }|slt          j        d	|fd
||f          t          j        |          t          j        |          dz  }dd|iz  }t	          t          j        |                    d x}x}}|d         }d}||k    }|slt          j        d	|fd
||f          t          j        |          t          j        |          dz  }dd|iz  }t	          t          j        |                    d x}x}}d}t          |          }||v}|st          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        |          dz  }dd|iz  }t	          t          j        |                    d x}x}}d S )NAltWert)	KategoriePositionJanFebJahrTyp)ru   Miete100.00r   z1200.00	Fixkosten)EssenHaushaltz50.00z60.00z660.00variabel)ArchivBudget 2026sheet_countra   r   rT   rU   rV   r"   current_budget_sheetr   main_category_countposition_countfixed_cost_candidate_countrr   budget_plan_candidate_countr   )not in)z4%(py1)s not in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}reprresultr0   r#   r$   )
r   r:   r;   r?   r@   rA   r   r<   r=   r>   )	rowsr   rJ   rd   rE   re   rH   rF   rI   s	            r   Ltest_excel_budget_seed_structural_dry_run_extracts_candidates_without_valuesr   U   sc   6?#BBBKKKIII
 D *$//F- %A% A%%%%%%%%%% A%%%%% %%%%A%%%%%%%%%%%%%%%%%%%%%%%%%%%():]:)]::::::::::)]:::::)::::]:::::::::::::::::::::::::::'(-A-(A----------(A-----(----A---------------------------"#(q(#q((((((((((#q(((((#((((q(((((((((((((((((((((((((((./414/14444444444/144444/44441444444444444444444444444444/05A50A55555555550A5555505555A555555555555555555555555555'4<<'8<''''''''''8<'''''8'''''''''''4'''''4''''''''''''''''''''''''<'''''''''''''''''''''''''''''r   )r   r   )$
__future__r   builtinsr<   _pytest.assertion.rewrite	assertionrewriter:   fastapi.testclientr   jarvis_finance.api.dependenciesr   jarvis_finance.api.mainr    jarvis_finance.budget.excel_seedr   )jarvis_finance.services.budget_categoriesr   r	   r
   r   $jarvis_finance.services.budget_plansr   r   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r   rO   ri   ry   r   r   r'   r   r   <module>r      s   " " " " " "               ) ) ) ) ) ) 2 2 2 2 2 2 . . . . . . I I I I I I t t t t t t t t t t t t C  C  C  C  C  C  C  C  C  C : : : : : : R R R R R R R R  7 7 7 7	l 	l 	l 	lY Y Y Y*L L L L,( ( ( ( ( (r   