@@ -549,7 +549,7 @@ mod tests {
549
549
use core:: time:: Duration ;
550
550
use crate :: ln:: features:: OfferFeatures ;
551
551
use crate :: ln:: msgs:: MAX_VALUE_MSAT ;
552
- use crate :: offers:: parse:: SemanticError ;
552
+ use crate :: offers:: parse:: { ParseError , SemanticError } ;
553
553
use crate :: onion_message:: { BlindedHop , BlindedPath } ;
554
554
use crate :: util:: ser:: Writeable ;
555
555
use crate :: util:: string:: PrintableString ;
@@ -832,6 +832,149 @@ mod tests {
832
832
assert_eq ! ( tlv_stream. quantity_max, None ) ;
833
833
834
834
}
835
+
836
+ #[ test]
837
+ fn parses_offer_with_chains ( ) {
838
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
839
+ . chain ( Network :: Bitcoin )
840
+ . chain ( Network :: Testnet )
841
+ . build ( )
842
+ . unwrap ( ) ;
843
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
844
+ panic ! ( "error parsing offer: {:?}" , e) ;
845
+ }
846
+ }
847
+
848
+ #[ test]
849
+ fn parses_offer_with_amount ( ) {
850
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
851
+ . amount ( Amount :: Bitcoin { amount_msats : 1000 } )
852
+ . build ( )
853
+ . unwrap ( ) ;
854
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
855
+ panic ! ( "error parsing offer: {:?}" , e) ;
856
+ }
857
+
858
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
859
+ . amount ( Amount :: Currency { iso4217_code : * b"USD" , amount : 1000 } )
860
+ . build ( )
861
+ . unwrap ( ) ;
862
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
863
+ panic ! ( "error parsing offer: {:?}" , e) ;
864
+ }
865
+
866
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
867
+ tlv_stream. amount = None ;
868
+ tlv_stream. currency = Some ( b"USD" ) ;
869
+
870
+ let mut encoded_offer = Vec :: new ( ) ;
871
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
872
+
873
+ match Offer :: try_from ( encoded_offer) {
874
+ Ok ( _) => panic ! ( "expected error" ) ,
875
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingAmount ) ) ,
876
+ }
877
+ }
878
+
879
+ #[ test]
880
+ fn parses_offer_with_description ( ) {
881
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) . unwrap ( ) ;
882
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
883
+ panic ! ( "error parsing offer: {:?}" , e) ;
884
+ }
885
+
886
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
887
+ tlv_stream. description = None ;
888
+
889
+ let mut encoded_offer = Vec :: new ( ) ;
890
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
891
+
892
+ match Offer :: try_from ( encoded_offer) {
893
+ Ok ( _) => panic ! ( "expected error" ) ,
894
+ Err ( e) => {
895
+ assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingDescription ) ) ;
896
+ } ,
897
+ }
898
+ }
899
+
900
+ #[ test]
901
+ fn parses_offer_with_paths ( ) {
902
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
903
+ . path ( BlindedPath {
904
+ introduction_node_id : pubkey ( 40 ) ,
905
+ blinding_point : pubkey ( 41 ) ,
906
+ blinded_hops : vec ! [
907
+ BlindedHop { blinded_node_id: pubkey( 43 ) , encrypted_payload: vec![ 0 ; 43 ] } ,
908
+ BlindedHop { blinded_node_id: pubkey( 44 ) , encrypted_payload: vec![ 0 ; 44 ] } ,
909
+ ] ,
910
+ } )
911
+ . path ( BlindedPath {
912
+ introduction_node_id : pubkey ( 40 ) ,
913
+ blinding_point : pubkey ( 41 ) ,
914
+ blinded_hops : vec ! [
915
+ BlindedHop { blinded_node_id: pubkey( 45 ) , encrypted_payload: vec![ 0 ; 45 ] } ,
916
+ BlindedHop { blinded_node_id: pubkey( 46 ) , encrypted_payload: vec![ 0 ; 46 ] } ,
917
+ ] ,
918
+ } )
919
+ . build ( )
920
+ . unwrap ( ) ;
921
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
922
+ panic ! ( "error parsing offer: {:?}" , e) ;
923
+ }
924
+
925
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
926
+ builder. offer . paths = Some ( vec ! [ ] ) ;
927
+
928
+ let offer = builder. build ( ) . unwrap ( ) ;
929
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
930
+ Ok ( _) => panic ! ( "expected error" ) ,
931
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingPaths ) ) ,
932
+ }
933
+ }
934
+
935
+ #[ test]
936
+ fn parses_offer_with_quantity ( ) {
937
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
938
+ . supported_quantity ( Quantity :: One )
939
+ . build ( )
940
+ . unwrap ( ) ;
941
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
942
+ panic ! ( "error parsing offer: {:?}" , e) ;
943
+ }
944
+
945
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
946
+ . supported_quantity ( Quantity :: Many )
947
+ . build ( )
948
+ . unwrap ( ) ;
949
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
950
+ panic ! ( "error parsing offer: {:?}" , e) ;
951
+ }
952
+
953
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
954
+ . supported_quantity ( Quantity :: Max ( NonZeroU64 :: new ( 10 ) . unwrap ( ) ) )
955
+ . build ( )
956
+ . unwrap ( ) ;
957
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
958
+ panic ! ( "error parsing offer: {:?}" , e) ;
959
+ }
960
+ }
961
+
962
+ #[ test]
963
+ fn parses_offer_with_node_id ( ) {
964
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) . unwrap ( ) ;
965
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
966
+ panic ! ( "error parsing offer: {:?}" , e) ;
967
+ }
968
+
969
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
970
+ builder. offer . signing_pubkey = None ;
971
+
972
+ let offer = builder. build ( ) . unwrap ( ) ;
973
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
974
+ Ok ( _) => panic ! ( "expected error" ) ,
975
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingNodeId ) ) ,
976
+ }
977
+ }
835
978
}
836
979
837
980
#[ cfg( test) ]
0 commit comments