@@ -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,178 @@ 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
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
881
+ tlv_stream. amount = Some ( MAX_VALUE_MSAT + 1 ) ;
882
+ tlv_stream. currency = None ;
883
+
884
+ let mut encoded_offer = Vec :: new ( ) ;
885
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
886
+
887
+ match Offer :: try_from ( encoded_offer) {
888
+ Ok ( _) => panic ! ( "expected error" ) ,
889
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: InvalidAmount ) ) ,
890
+ }
891
+ }
892
+
893
+ #[ test]
894
+ fn parses_offer_with_description ( ) {
895
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) . unwrap ( ) ;
896
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
897
+ panic ! ( "error parsing offer: {:?}" , e) ;
898
+ }
899
+
900
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
901
+ tlv_stream. description = None ;
902
+
903
+ let mut encoded_offer = Vec :: new ( ) ;
904
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
905
+
906
+ match Offer :: try_from ( encoded_offer) {
907
+ Ok ( _) => panic ! ( "expected error" ) ,
908
+ Err ( e) => {
909
+ assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingDescription ) ) ;
910
+ } ,
911
+ }
912
+ }
913
+
914
+ #[ test]
915
+ fn parses_offer_with_paths ( ) {
916
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
917
+ . path ( BlindedPath {
918
+ introduction_node_id : pubkey ( 40 ) ,
919
+ blinding_point : pubkey ( 41 ) ,
920
+ blinded_hops : vec ! [
921
+ BlindedHop { blinded_node_id: pubkey( 43 ) , encrypted_payload: vec![ 0 ; 43 ] } ,
922
+ BlindedHop { blinded_node_id: pubkey( 44 ) , encrypted_payload: vec![ 0 ; 44 ] } ,
923
+ ] ,
924
+ } )
925
+ . path ( BlindedPath {
926
+ introduction_node_id : pubkey ( 40 ) ,
927
+ blinding_point : pubkey ( 41 ) ,
928
+ blinded_hops : vec ! [
929
+ BlindedHop { blinded_node_id: pubkey( 45 ) , encrypted_payload: vec![ 0 ; 45 ] } ,
930
+ BlindedHop { blinded_node_id: pubkey( 46 ) , encrypted_payload: vec![ 0 ; 46 ] } ,
931
+ ] ,
932
+ } )
933
+ . build ( )
934
+ . unwrap ( ) ;
935
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
936
+ panic ! ( "error parsing offer: {:?}" , e) ;
937
+ }
938
+
939
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
940
+ builder. offer . paths = Some ( vec ! [ ] ) ;
941
+
942
+ let offer = builder. build ( ) . unwrap ( ) ;
943
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
944
+ panic ! ( "error parsing offer: {:?}" , e) ;
945
+ }
946
+ }
947
+
948
+ #[ test]
949
+ fn parses_offer_with_quantity ( ) {
950
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
951
+ . supported_quantity ( Quantity :: one ( ) )
952
+ . build ( )
953
+ . unwrap ( ) ;
954
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
955
+ panic ! ( "error parsing offer: {:?}" , e) ;
956
+ }
957
+
958
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
959
+ . supported_quantity ( Quantity :: Unbounded )
960
+ . build ( )
961
+ . unwrap ( ) ;
962
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
963
+ panic ! ( "error parsing offer: {:?}" , e) ;
964
+ }
965
+
966
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
967
+ . supported_quantity ( Quantity :: Bounded ( NonZeroU64 :: new ( 10 ) . unwrap ( ) ) )
968
+ . build ( )
969
+ . unwrap ( ) ;
970
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
971
+ panic ! ( "error parsing offer: {:?}" , e) ;
972
+ }
973
+
974
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
975
+ tlv_stream. quantity_max = Some ( 1 ) ;
976
+
977
+ let mut encoded_offer = Vec :: new ( ) ;
978
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
979
+
980
+ match Offer :: try_from ( encoded_offer) {
981
+ Ok ( _) => panic ! ( "expected error" ) ,
982
+ Err ( e) => {
983
+ assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: InvalidQuantity ) ) ;
984
+ } ,
985
+ }
986
+ }
987
+
988
+ #[ test]
989
+ fn parses_offer_with_node_id ( ) {
990
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) . unwrap ( ) ;
991
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
992
+ panic ! ( "error parsing offer: {:?}" , e) ;
993
+ }
994
+
995
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
996
+ builder. offer . signing_pubkey = None ;
997
+
998
+ let offer = builder. build ( ) . unwrap ( ) ;
999
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
1000
+ Ok ( _) => panic ! ( "expected error" ) ,
1001
+ Err ( e) => {
1002
+ assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingSigningPubkey ) ) ;
1003
+ } ,
1004
+ }
1005
+ }
834
1006
}
835
1007
836
1008
#[ cfg( test) ]
0 commit comments