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