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