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