@@ -561,7 +561,7 @@ mod tests {
561
561
use core:: time:: Duration ;
562
562
use crate :: ln:: features:: OfferFeatures ;
563
563
use crate :: ln:: msgs:: MAX_VALUE_MSAT ;
564
- use crate :: offers:: parse:: SemanticError ;
564
+ use crate :: offers:: parse:: { ParseError , SemanticError } ;
565
565
use crate :: onion_message:: { BlindedHop , BlindedPath } ;
566
566
use crate :: util:: ser:: Writeable ;
567
567
use crate :: util:: string:: PrintableString ;
@@ -840,6 +840,165 @@ mod tests {
840
840
assert_eq ! ( offer. supported_quantity( ) , Quantity :: one( ) ) ;
841
841
assert_eq ! ( tlv_stream. quantity_max, None ) ;
842
842
}
843
+
844
+ #[ test]
845
+ fn parses_offer_with_chains ( ) {
846
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
847
+ . chain ( Network :: Bitcoin )
848
+ . chain ( Network :: Testnet )
849
+ . build ( )
850
+ . unwrap ( ) ;
851
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
852
+ panic ! ( "error parsing offer: {:?}" , e) ;
853
+ }
854
+ }
855
+
856
+ #[ test]
857
+ fn parses_offer_with_amount ( ) {
858
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
859
+ . amount ( Amount :: Bitcoin { amount_msats : 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 = Some ( 1000 ) ;
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
+ if let Err ( e) = Offer :: try_from ( encoded_offer) {
874
+ panic ! ( "error parsing offer: {:?}" , e) ;
875
+ }
876
+
877
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
878
+ tlv_stream. amount = None ;
879
+ tlv_stream. currency = Some ( b"USD" ) ;
880
+
881
+ let mut encoded_offer = Vec :: new ( ) ;
882
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
883
+
884
+ match Offer :: try_from ( encoded_offer) {
885
+ Ok ( _) => panic ! ( "expected error" ) ,
886
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingAmount ) ) ,
887
+ }
888
+ }
889
+
890
+ #[ test]
891
+ fn parses_offer_with_description ( ) {
892
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) . unwrap ( ) ;
893
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
894
+ panic ! ( "error parsing offer: {:?}" , e) ;
895
+ }
896
+
897
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
898
+ tlv_stream. description = None ;
899
+
900
+ let mut encoded_offer = Vec :: new ( ) ;
901
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
902
+
903
+ match Offer :: try_from ( encoded_offer) {
904
+ Ok ( _) => panic ! ( "expected error" ) ,
905
+ Err ( e) => {
906
+ assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingDescription ) ) ;
907
+ } ,
908
+ }
909
+ }
910
+
911
+ #[ test]
912
+ fn parses_offer_with_paths ( ) {
913
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
914
+ . path ( BlindedPath {
915
+ introduction_node_id : pubkey ( 40 ) ,
916
+ blinding_point : pubkey ( 41 ) ,
917
+ blinded_hops : vec ! [
918
+ BlindedHop { blinded_node_id: pubkey( 43 ) , encrypted_payload: vec![ 0 ; 43 ] } ,
919
+ BlindedHop { blinded_node_id: pubkey( 44 ) , encrypted_payload: vec![ 0 ; 44 ] } ,
920
+ ] ,
921
+ } )
922
+ . path ( BlindedPath {
923
+ introduction_node_id : pubkey ( 40 ) ,
924
+ blinding_point : pubkey ( 41 ) ,
925
+ blinded_hops : vec ! [
926
+ BlindedHop { blinded_node_id: pubkey( 45 ) , encrypted_payload: vec![ 0 ; 45 ] } ,
927
+ BlindedHop { blinded_node_id: pubkey( 46 ) , encrypted_payload: vec![ 0 ; 46 ] } ,
928
+ ] ,
929
+ } )
930
+ . build ( )
931
+ . unwrap ( ) ;
932
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
933
+ panic ! ( "error parsing offer: {:?}" , e) ;
934
+ }
935
+
936
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
937
+ builder. offer . paths = Some ( vec ! [ ] ) ;
938
+
939
+ let offer = builder. build ( ) . unwrap ( ) ;
940
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
941
+ Ok ( _) => panic ! ( "expected error" ) ,
942
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingPaths ) ) ,
943
+ }
944
+ }
945
+
946
+ #[ test]
947
+ fn parses_offer_with_quantity ( ) {
948
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
949
+ . supported_quantity ( Quantity :: one ( ) )
950
+ . build ( )
951
+ . unwrap ( ) ;
952
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
953
+ panic ! ( "error parsing offer: {:?}" , e) ;
954
+ }
955
+
956
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
957
+ . supported_quantity ( Quantity :: Unbounded )
958
+ . build ( )
959
+ . unwrap ( ) ;
960
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
961
+ panic ! ( "error parsing offer: {:?}" , e) ;
962
+ }
963
+
964
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
965
+ . supported_quantity ( Quantity :: Bounded ( NonZeroU64 :: new ( 10 ) . unwrap ( ) ) )
966
+ . build ( )
967
+ . unwrap ( ) ;
968
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
969
+ panic ! ( "error parsing offer: {:?}" , e) ;
970
+ }
971
+
972
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
973
+ tlv_stream. quantity_max = Some ( 1 ) ;
974
+
975
+ let mut encoded_offer = Vec :: new ( ) ;
976
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
977
+
978
+ match Offer :: try_from ( encoded_offer) {
979
+ Ok ( _) => panic ! ( "expected error" ) ,
980
+ Err ( e) => {
981
+ assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: InvalidQuantity ) ) ;
982
+ } ,
983
+ }
984
+ }
985
+
986
+ #[ test]
987
+ fn parses_offer_with_node_id ( ) {
988
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) . unwrap ( ) ;
989
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
990
+ panic ! ( "error parsing offer: {:?}" , e) ;
991
+ }
992
+
993
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
994
+ builder. offer . signing_pubkey = None ;
995
+
996
+ let offer = builder. build ( ) . unwrap ( ) ;
997
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
998
+ Ok ( _) => panic ! ( "expected error" ) ,
999
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingNodeId ) ) ,
1000
+ }
1001
+ }
843
1002
}
844
1003
845
1004
#[ cfg( test) ]
0 commit comments