1
+ // EXAMPLE: hash_tutorial
2
+ #[ cfg( test) ]
3
+ mod tests {
4
+ use redis:: AsyncCommands ;
5
+
6
+ #[ tokio:: test]
7
+ async fn run ( ) {
8
+ let mut r = match redis:: Client :: open ( "redis://127.0.0.1" ) {
9
+ Ok ( client) => {
10
+ match client. get_multiplexed_async_connection ( ) . await {
11
+ Ok ( conn) => conn,
12
+ Err ( e) => {
13
+ println ! ( "Failed to connect to Redis: {e}" ) ;
14
+ return ;
15
+ }
16
+ }
17
+ } ,
18
+ Err ( e) => {
19
+ println ! ( "Failed to create Redis client: {e}" ) ;
20
+ return ;
21
+ }
22
+ } ;
23
+ // REMOVE_START
24
+ let _: ( ) = r. flushall ( ) . await . expect ( "Failed to flushall" ) ;
25
+ // REMOVE_END
26
+
27
+ // STEP_START set_get_all
28
+ let hash_fields = [
29
+ ( "model" , "Deimos" ) ,
30
+ ( "brand" , "Ergonom" ) ,
31
+ ( "type" , "Enduro bikes" ) ,
32
+ ( "price" , "4972" ) ,
33
+ ] ;
34
+
35
+ if let Ok ( res) = r. hset_multiple ( "bike:1" , & hash_fields) . await {
36
+ let res: String = res;
37
+ println ! ( "{res}" ) ; // >>> OK
38
+ // REMOVE_START
39
+ assert_eq ! ( res, "OK" ) ;
40
+ // REMOVE_END
41
+ }
42
+
43
+ match r. hget ( "bike:1" , "model" ) . await {
44
+ Ok ( res) => {
45
+ let res: String = res;
46
+ println ! ( "{res}" ) ; // >>> Deimos
47
+ // REMOVE_START
48
+ assert_eq ! ( res, "Deimos" ) ;
49
+ // REMOVE_END
50
+ } ,
51
+ Err ( e) => {
52
+ println ! ( "Error getting bike:1 model: {e}" ) ;
53
+ return ;
54
+ }
55
+ } ;
56
+
57
+ match r. hget ( "bike:1" , "price" ) . await {
58
+ Ok ( res) => {
59
+ let res: String = res;
60
+ println ! ( "{res}" ) ; // >>> 4972
61
+ // REMOVE_START
62
+ assert_eq ! ( res, "4972" ) ;
63
+ // REMOVE_END
64
+ } ,
65
+ Err ( e) => {
66
+ println ! ( "Error getting bike:1 price: {e}" ) ;
67
+ return ;
68
+ }
69
+ } ;
70
+
71
+ match r. hgetall ( "bike:1" ) . await {
72
+ Ok ( res) => {
73
+ let res: Vec < ( String , String ) > = res;
74
+ println ! ( "{res:?}" ) ;
75
+ // >>> [("model", "Deimos"), ("brand", "Ergonom"), ("type", "Enduro bikes"), ("price", "4972")]
76
+ // REMOVE_START
77
+ assert_eq ! ( res. len( ) , 4 ) ;
78
+ assert_eq ! ( res[ 0 ] . 0 , "model" ) ;
79
+ assert_eq ! ( res[ 0 ] . 1 , "Deimos" ) ;
80
+ assert_eq ! ( res[ 1 ] . 0 , "brand" ) ;
81
+ assert_eq ! ( res[ 1 ] . 1 , "Ergonom" ) ;
82
+ assert_eq ! ( res[ 2 ] . 0 , "type" ) ;
83
+ assert_eq ! ( res[ 2 ] . 1 , "Enduro bikes" ) ;
84
+ assert_eq ! ( res[ 3 ] . 0 , "price" ) ;
85
+ assert_eq ! ( res[ 3 ] . 1 , "4972" ) ;
86
+ // REMOVE_END
87
+ } ,
88
+ Err ( e) => {
89
+ println ! ( "Error getting bike:1: {e}" ) ;
90
+ return ;
91
+ }
92
+ } ;
93
+ // STEP_END
94
+
95
+ // STEP_START hmget
96
+ match r. hmget ( "bike:1" , & [ "model" , "price" ] ) . await {
97
+ Ok ( res) => {
98
+ let res: Vec < String > = res;
99
+ println ! ( "{res:?}" ) ; // >>> ["Deimos", "4972"]
100
+ // REMOVE_START
101
+ assert_eq ! ( res. len( ) , 2 ) ;
102
+ assert_eq ! ( res[ 0 ] , "Deimos" ) ;
103
+ assert_eq ! ( res[ 1 ] , "4972" ) ;
104
+ // REMOVE_END
105
+ } ,
106
+ Err ( e) => {
107
+ println ! ( "Error getting bike:1: {e}" ) ;
108
+ return ;
109
+ }
110
+ } ;
111
+ // STEP_END
112
+
113
+ // STEP_START hincrby
114
+ if let Ok ( res) = r. hincr ( "bike:1" , "price" , 100 ) . await {
115
+ let res: i32 = res;
116
+ println ! ( "{res}" ) ; // >>> 5072
117
+ // REMOVE_START
118
+ assert_eq ! ( res, 5072 ) ;
119
+ // REMOVE_END
120
+ }
121
+
122
+ if let Ok ( res) = r. hincr ( "bike:1" , "price" , -100 ) . await {
123
+ let res: i32 = res;
124
+ println ! ( "{res}" ) ; // >>> 4972
125
+ // REMOVE_START
126
+ assert_eq ! ( res, 4972 ) ;
127
+ // REMOVE_END
128
+ }
129
+ // STEP_END
130
+
131
+ // STEP_START incrby_get_mget
132
+ if let Ok ( res) = r. hincr ( "bike:1:stats" , "rides" , 1 ) . await {
133
+ let res: i32 = res;
134
+ println ! ( "{res}" ) ; // >>> 1
135
+ // REMOVE_START
136
+ assert_eq ! ( res, 1 ) ;
137
+ // REMOVE_END
138
+ }
139
+
140
+ if let Ok ( res) = r. hincr ( "bike:1:stats" , "rides" , 1 ) . await {
141
+ let res: i32 = res;
142
+ println ! ( "{res}" ) ; // >>> 2
143
+ // REMOVE_START
144
+ assert_eq ! ( res, 2 ) ;
145
+ // REMOVE_END
146
+ }
147
+
148
+ if let Ok ( res) = r. hincr ( "bike:1:stats" , "rides" , 1 ) . await {
149
+ let res: i32 = res;
150
+ println ! ( "{res}" ) ; // >>> 3
151
+ // REMOVE_START
152
+ assert_eq ! ( res, 3 ) ;
153
+ // REMOVE_END
154
+ }
155
+
156
+ if let Ok ( res) = r. hincr ( "bike:1:stats" , "crashes" , 1 ) . await {
157
+ let res: i32 = res;
158
+ println ! ( "{res}" ) ; // >>> 1
159
+ // REMOVE_START
160
+ assert_eq ! ( res, 1 ) ;
161
+ // REMOVE_END
162
+ }
163
+
164
+ if let Ok ( res) = r. hincr ( "bike:1:stats" , "owners" , 1 ) . await {
165
+ let res: i32 = res;
166
+ println ! ( "{res}" ) ; // >>> 1
167
+ // REMOVE_START
168
+ assert_eq ! ( res, 1 ) ;
169
+ // REMOVE_END
170
+ }
171
+
172
+ match r. hget ( "bike:1:stats" , "rides" ) . await {
173
+ Ok ( res) => {
174
+ let res: i32 = res;
175
+ println ! ( "{res}" ) ; // >>> 3
176
+ // REMOVE_START
177
+ assert_eq ! ( res, 3 ) ;
178
+ // REMOVE_END
179
+ } ,
180
+ Err ( e) => {
181
+ println ! ( "Error getting bike:1:stats rides: {e}" ) ;
182
+ return ;
183
+ }
184
+ } ;
185
+
186
+ match r. hmget ( "bike:1:stats" , & [ "crashes" , "owners" ] ) . await {
187
+ Ok ( res) => {
188
+ let res: Vec < i32 > = res;
189
+ println ! ( "{res:?}" ) ; // >>> [1, 1]
190
+ // REMOVE_START
191
+ assert_eq ! ( res. len( ) , 2 ) ;
192
+ assert_eq ! ( res[ 0 ] , 1 ) ;
193
+ assert_eq ! ( res[ 1 ] , 1 ) ;
194
+ // REMOVE_END
195
+ } ,
196
+ Err ( e) => {
197
+ println ! ( "Error getting bike:1:stats crashes and owners: {e}" ) ;
198
+ return ;
199
+ }
200
+ } ;
201
+ // STEP_END
202
+ }
203
+ }
0 commit comments