
    Z^Aj%                    ~    d dl mZ d dlZd dlmc mZ d dlZd dl	m
Z
 d dlmZmZmZ d Zd Zd Zd Zd	 Zd
 Zd ZdS )    )annotationsN)Path)TradingViewWebhookConfighandle_tradingview_payloadnormalize_tradingview_payloadc            
     H    ddddddddd	d
	}|                     |            |S )Ntradingviewgaussian_channel_v1BTCUSDTlongentry1hz61234.5z2026-06-28T18:00:00Zztv-btc-1h-20260628T1800)	sourcestrategysymbolsideaction	timeframeprice	timestamp	signal_id)update)	overridespayloads     ]/home/agent/projects/CryptoTradingBot/Crypto_Agent/tests/test_tradingview_signal_ingestion.py_payloadr      sB    )+.
 
G NN9N    c                 T	   t          t          d          dhddh          } | 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}||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}||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}||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}||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}||u }|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 S )Nz	BTCUSDT.P)r   r
   BTCETH)allowed_strategiesallowed_coins==)z,%(py2)s
{%(py2)s = %(py0)s.coin
} == %(py5)ssignal)py0py2py5zassert %(py7)spy7)z3%(py2)s
{%(py2)s = %(py0)s.strategy_id
} == %(py5)sr   )z,%(py2)s
{%(py2)s = %(py0)s.side
} == %(py5)sr   )z.%(py2)s
{%(py2)s = %(py0)s.action
} == %(py5)spaper_signal)z6%(py2)s
{%(py2)s = %(py0)s.execution_mode
} == %(py5)sFis)z:%(py2)s
{%(py2)s = %(py0)s.live_order_allowed
} is %(py5)s)r   r   coin
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationstrategy_idr   r   execution_modelive_order_allowed)r%   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s         r   Ktest_normalize_tradingview_payload_maps_symbol_and_defaults_to_paper_signalr>      sw   *$$$12en  F ;%;%;%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66666666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      ;    &                           =#G#=G##########=G############6#####6######=####G########################### 2N2 N2222222222 N2222222222226222226222222 2222N222222222222222222222222222$--$----------$------------6-----6------$---------------------------------r   c           
     
   t          | ddhdh          }t          t          dd          ddi|	          }|d
         }d}||u }|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}| |z  }d}	||	z  }
|
j        } |            }| }|sddt          j
                    v st          j        |           rt          j        |           ndt          j        |          t          j        |	          t          j        |          t          j        |          dz  }t          t          j        |                    d x}x}x}	x}
x}x}}| dz  dz  }t          j        |                    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         }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}||u }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d!}t          j        }	 |	|          }|j        } |            }||v}|s+t          j        d"|fd#||f          t          j        |          d$t          j
                    v st          j        t                    rt          j        t                    nd$t          j        |	          d%t          j
                    v st          j        |          rt          j        |          nd%t          j        |          t          j        |          t          j        |          d&z  }d'd(|iz  }t          t          j        |                    d x}x}x}	x}x}}d S ))Nexpected-secretsqueeze_breakout_1hr   runtime_dirsecretr!   r"   unknown_strategy$payload-secret-should-not-be-written)r   rD   X-CTB-Webhook-SecretheadersconfigacceptedFr+   z%(py1)s is %(py4)spy1py4assert %(py6)spy6reasonstrategy_not_allowedr#   z%(py1)s == %(py4)ssignalssignal_journal.jsonl_assert not %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = ((%(py0)s / %(py2)s) / %(py5)s).exists
}()
}tmp_pathr&   r'   r(   py8py10rejected_signal_journal.jsonlutf-8encodingr   r   r	   r8   rD   not inz%(py1)s not in %(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py5)s
{%(py5)s = %(py3)s.dumps
}(%(py6)s)
}.lower
}()
}jsonrowrN   py3r(   rQ   rZ   r[   py12assert %(py14)spy14)r   r   r   r.   r/   r3   r4   r5   existsr0   r1   r2   rc   loads	read_text
splitlinesdumpslower)rX   cfgresult@py_assert0r;   @py_assert2@py_format5@py_format7r9   r:   @py_assert6@py_assert7@py_assert9@py_assert11@py_format12reject_journalrd   @py_format13@py_format15s                      r   Qtest_invalid_strategy_is_rejected_without_signal_journal_but_with_rejection_auditr~   ,   s   
" 12g	  C (,5[\\\'):;  F *&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(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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$G9$G'=G$'==G=EGEEGGGGGGGGGGGGGGGGGGGGGGGGGGGGG9GGGG'=GGGGEGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG	),KKN
*^--w-??JJLLQO
P
PCx=222=22222222222=222222=22222222222222222222222222222222x=)M)=M))))))))))=M)))))=))))M)))))))))))))))))))))))))))#$--$----------$-----$-------------------------------24:2::c??2?020022282222222222282222228222222222224222224222222:22222222222c22222c222222?222202222222222222222222222222222222222222222r   c                B   t          | ddhdh          }t          t                      i |          }|d         }d}||u }|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}||u }|slt          j        d|fd	||f          t          j        |          t          j        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}d}| |z  }d}	||	z  }
|
j        } |            }| }|sddt          j
                    v st          j        |           rt          j        |           ndt          j        |          t          j        |	          t          j        |          t          j        |          dz  }t          t          j        |                    d x}x}x}	x}
x}x}}d S )Nr@   r
   r   rB   rH   rK   Fr+   rL   rM   rP   rQ   rR   unauthorizedr#   rT   r8   rU   r\   rW   rX   rY   )r   r   r   r.   r/   r3   r4   r5   rj   r0   r1   r2   )rX   rp   rq   rr   r;   rs   rt   ru   r9   r:   rv   rw   rx   ry   rz   s                  r   8test_webhook_requires_secret_and_never_allows_live_orderr   E   sU   
" 12g	  C (

BsKKKF*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(-~-~----------~---------~---------------------------&'050'50000000000'500000'00005000000000000000000000000000$P9$P'FP$'FFPFNPNNPPPPPPPPPPPPPPPPPPPPPPPPPPPPP9PPPP'FPPPPNPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPr   c           
     &   t          | ddhdh          }t          t          d          ddi|          }|d	         }d
}||u }|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}||u }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}| dz  dz  }d |                    d          	                                D             }	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%}||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}||u }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d'}t          j        } ||          }|j        } |            }||v}|s+t          j        d(|fd)||f          t          j        |          d*t          j                    v st          j        t                    rt          j        t                    nd*t          j        |          d+t          j                    v st          j        |          rt          j        |          nd+t          j        |          t          j        |          t          j        |          d,z  }d-d.|iz  }t          t          j        |                    d x}x}x}x}x}}d S )/Nr@   r
   r   rB   rF   )rD   rG   rH   rK   Tr+   rL   rM   rP   rQ   r-   r#   rT   r7   r*   r8   FrU   rV   c                6    g | ]}t          j        |          S  )rc   rk   ).0lines     r   
<listcomp>zJtest_accepted_webhook_appends_sanitized_signal_journal.<locals>.<listcomp>i   s"    ZZZDJtZZZr   r]   r^      )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenrows)r&   rN   rf   rQ   zassert %(py8)srZ   r   r   r	   r6   rD   r`   rb   rc   rd   re   rh   ri   )r   r   r   r.   r/   r3   r4   r5   rl   rm   r   r0   r1   r2   rc   rn   ro   )rX   rp   rq   rr   r;   rs   rt   ru   journalr   @py_assert5r:   @py_format9rd   rw   rx   ry   r|   r}   s                      r   6test_accepted_webhook_appends_sanitized_signal_journalr   U   s+	   
" 12g	  C (>???'):;  F *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&>"U">U"""""""""">U""""">""""U""""""""""""""""""""""""""""#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555555555555555555555&'050'50000000000'500000'00005000000000000000000000000000"%;;GZZ):):G):)L)L)W)W)Y)YZZZDt999>933tt9
q'Cx=)M)=M))))))))))=M)))))=))))M)))))))))))))))))))))))))))v;%;%;%;%}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 2N2 N2222222222 N22222 2222N222222222222222222222222222#$--$----------$-----$-------------------------------24:2::c??2?020022282222222222282222228222222222224222224222222:22222222222c22222c222222?222202222222222222222222222222222222222222222r   c                   t          | ddhdh          }ddi}t          t                      ||          }t          t                      ||          }|d         }d}||u }|slt          j        d	|fd
||f          t          j        |          t          j        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}}|d         }d}||u }|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 S )Nr@   r
   r   rB   rG   rH   rK   Tr+   rL   rM   rP   rQ   FrR   duplicate_signalr#   rT   )r   r   r   r.   r/   r3   r4   r5   )
rX   rp   rI   firstsecondrr   r;   rs   rt   ru   s
             r   $test_duplicate_signal_id_is_rejectedr   t   si   
" 12g	  C &'89G&xzz73OOOE'

GCPPPF$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(111111111111111111111111111111111111111111111111111111r   c                   | dz  }|                     t          j        t                                d           | dz  }|                     dd           ddlm}  |dt          |          d	t          | d
z            dt          |          dddddddg          }d}||k    }|st          j        d|fd||f          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}}d
}| |z  }	d}
|	|
z  }d}||z  }|j        } |            }|sddt          j
                    v st          j        |           rt          j        |           ndt          j        |          t          j        |
          t          j        |          t          j        |          t          j        |          dz  }t          t          j        |                    d x}x}	x}
x}x}x}x}}d S )Nzpayload.jsonr]   r^   z
secret.txtzexpected-secret
r   )mainz--payload-filez--runtime-dirruntimez--secret-filez--header-secretr@   z--allowed-strategyr
   z--allowed-coinr   z--jsonr#   )z%(py0)s == %(py3)s	exit_code)r&   rf   zassert %(py5)sr(   rU   rV   ziassert %(py13)s
{%(py13)s = %(py11)s
{%(py11)s = (((%(py0)s / %(py2)s) / %(py5)s) / %(py8)s).exists
}()
}rX   )r&   r'   r(   rZ   py11py13)
write_textrc   rn   r   src.tools.tradingview_webhookr   strr.   r/   r0   r1   r2   r3   r4   r5   rj   )rX   payload_pathsecret_pathr   r   rs   r9   @py_format4r<   r;   r:   rv   rw   rx   @py_assert10@py_assert12@py_format14s                    r   test_cli_ingests_payload_filer      s   n,LDJxzz22WEEE\)K.AAA222222#l++X	122[)),3%  I 9>999 OHy O9O 9,O/EO,/EEOEMOMMOOOOOOOOOOOOOOOHOOOOOHOOOOOOyOOOO9OOOO/EOOOOM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OOOOOOOOOOr   )
__future__r   builtinsr0   _pytest.assertion.rewrite	assertionrewriter.   rc   pathlibr   src.signals.tradingviewr   r   r   r   r>   r~   r   r   r   r   r   r   r   <module>r      s    " " " " " "                                . . .3 3 32Q Q Q 3 3 3>2 2 2"P P P P Pr   