source: project/release/4/estraier-client/tags/0.3.2/tests/run.scm @ 33134

Last change on this file since 33134 was 33134, checked in by sjamaan, 5 years ago

estraier-client: Fix tests to use utils, which is where system* is at

File size: 10.3 KB
Line 
1(load "../estraier-client.scm")
2
3(use utils test posix http-client srfi-13)
4
5(import estraier-client)
6
7;; Avoid listening on the default estraier port because the main Salmonella
8;; runs on the same server as qwiki, which uses estraier in a default config.
9(define server-port
10  (string->number
11   (or (get-environment-variable "ESTRAIER_CLIENT_TEST_PORT") "8080")))
12
13(test-begin "estraier")
14
15;; This will start the server, we hope
16(handle-exceptions exn
17  (error (conc "Couldn't start or initialize estmaster. "
18               "You probably don't have hyper-estraier installed. "
19               "If you do, check $ESTRAIER_CLIENT_TEST_PORT (default 8080)"))
20 (system* "rm -rf masterdir")          ; Just in case
21 (system* "estmaster init masterdir")
22;; Try and replace the portnumber with another value.  Ugly, I know
23 (let* ((contents (with-input-from-file "masterdir/_conf" read-lines))
24        (changed-contents (map (lambda (l)
25                                 (if (string-prefix? "portnum:" l)
26                                     (conc "portnum: " server-port) l))
27                               contents)))
28   (with-output-to-file "masterdir/_conf"
29     (lambda () (for-each print changed-contents))))
30 (printf "Waiting for estmaster to startup...")
31 (system* "estmaster start -bg masterdir > /dev/null 2>&1"))
32(sleep 2)
33
34(define base-uri (conc "http://admin:admin@localhost:" server-port))
35
36(test-group "node master API"
37  (test "Empty node list on init" '() (list-nodes base-uri))
38  (test-error "Cannot connect with invalid credentials"
39              (list-nodes (conc "http://admin:invalid@localhost:" server-port)))
40  (let ((nodes (begin (add-node base-uri "testnode")
41                      (add-node base-uri "testnode2" "testlabel")
42                      (list-nodes base-uri))))
43    (test "After adding two nodes, they show up"
44          '("testnode" "testnode2")
45          (map (lambda (n) (alist-ref 'name n)) nodes))
46    (test "Node label is accepted"
47          '("testnode" "testlabel")
48          (map (lambda (n) (alist-ref 'label n)) nodes)))
49  (test "After deleting a node, it is gone"
50        '("testnode")
51        (begin (delete-node base-uri "testnode2")
52               (map (lambda (n) (alist-ref 'name n)) (list-nodes base-uri))))
53  (let ((users (begin (add-user base-uri "testuser" "password"
54                                fullname: "Joe testuser"
55                                misc: "This is just a test")
56                      (list-users base-uri))))
57    (test "After adding a user, it shows up"
58          '("admin" "testuser")
59          (map (lambda (u) (alist-ref 'name u)) users)))
60  (test "After deleting a user, it is gone"
61        '("admin")
62        (begin (delete-user base-uri "testuser")
63               (map (lambda (u) (alist-ref 'name u)) (list-users base-uri)))))
64
65;; TODO: more in-depth tests of master result values
66
67(test-group "node API"
68  (let ((info (get-node-info base-uri "testnode")))
69    (test "Get-node-info reports zero documents at first"
70          0 (alist-ref 'document-count info))
71    (test "Get-node-info reports zero words at first"
72          0 (alist-ref 'word-count info))
73    (test "Get-node-info reports no guests at first"
74          '() (alist-ref 'guest-users info))
75    (test "Get-node-info reports no admins at first"
76          '() (alist-ref 'admin-users info)))
77  (test "Cache usage starts out empty"
78        0.0 (get-cache-usage base-uri "testnode"))
79  (test "Document list starts out empty"
80        '() (list-documents base-uri "testnode"))
81
82  (test "After registering admins and guests, they are listed in node info"
83        '(("guest1" "guest2" "both") ("admin1" "admin2" "both"))
84        (begin (register-guest-user base-uri "testnode" "guest1")
85               (register-guest-user base-uri "testnode" "guest2")
86               (register-guest-user base-uri "testnode" "both")
87               (register-admin-user base-uri "testnode" "admin1")
88               (register-admin-user base-uri "testnode" "admin2")
89               (register-admin-user base-uri "testnode" "both")
90               (let ((info (get-node-info base-uri "testnode")))
91                 (list (alist-ref 'guest-users info)
92                       (alist-ref 'admin-users info)))))
93  (test "After unregistering users, they are not listed"
94        '(("guest2") ("admin2"))
95        (begin (unregister-user base-uri "testnode" "guest1")
96               (unregister-user base-uri "testnode" "admin1")
97               (unregister-user base-uri "testnode" "both")
98               (let ((info (get-node-info base-uri "testnode")))
99                 (list (alist-ref 'guest-users info)
100                       (alist-ref 'admin-users info)))))
101 
102  (test-error "Putting document without URI is an error"
103              (put-document base-uri "testnode" "This is just a test" '()))
104  (test-assert "Putting documents with URIs succeed"
105               (begin
106                 (put-document base-uri "testnode" '("Just a test for estraier")
107                               '((@uri . "/test1") (my-tag . "something")))
108                 (put-document base-uri "testnode" '("Another test for estraier")
109                               '((@uri . "/test2") (my-tag . "foo") (my-other-tag . "whatever")))
110                 #t))
111  ;; If we don't sync, the newly added docs don't (always?) show up...
112  (test-assert "Synchronize works" (begin (sync-node base-uri "testnode") #t))
113  (let ((info (get-node-info base-uri "testnode")))
114    (test "Get-node-info reports the new documents"
115          2 (alist-ref 'document-count info))
116    (test "Get-node-info reports the total number of words"
117          6 (alist-ref 'word-count info))  ;; "test for estraier" is in both
118    ;; Why does this still report zero?
119    #;(test-assert "Size is nonzero" (> 0 (alist-ref 'size info))))
120  (test "Documents are listed"
121        '("/test1" "/test2")
122        (map (lambda (l) (alist-ref '@uri l)) (list-documents base-uri "testnode")))
123  (test "Skipping list results works"
124        '("/test2")
125        (map (lambda (l) (alist-ref '@uri l))
126             (list-documents base-uri "testnode" prev: "/test1")))
127  (test "Maximum result length is used"
128        '("/test1")
129        (map (lambda (l) (alist-ref '@uri l))
130             (list-documents base-uri "testnode" max: 1)))
131  (test "Document keywords are correct"
132        '("a" "estraier" "for" "just" "test")
133        (sort (map car (document-keywords base-uri "testnode" uri: "/test1")) string<?))
134
135  (receive (doc meta)
136    (get-document base-uri "testnode" uri: "/test1")
137    (test "Get-document returns document"
138          '("Just a test for estraier")
139          (values doc))
140    (test "Get-document returns attributes"
141          '("/test1" "something")
142          (list (alist-ref '@uri meta) (alist-ref 'my-tag meta)))
143    (test-assert "Updating gives no error"
144                 (begin
145                   (update-attributes
146                    base-uri "testnode" (alist-update! 'my-tag "or other" meta))
147                   #t))
148    (receive (doc meta)
149      (get-document base-uri "testnode" uri: "/test1")
150      (test "Get-document returns updated attributes"
151            "or other"
152            (alist-ref 'my-tag meta))
153      (test-assert "Putting a modified doc gives no error"
154                   (begin
155                     (put-document base-uri "testnode"
156                                   '("Simply a test for estraier")
157                                   meta)
158                     (sync-node base-uri "testnode") 
159                    #t))
160      (receive (doc meta)
161        (get-document base-uri "testnode" uri: "/test1")
162        (test "Updated document is accepted"
163              '("Simply a test for estraier")
164              (values doc)))))
165
166  (test "Document-attribute returns correct attributes"
167        "or other"
168        (document-attribute base-uri "testnode" 'my-tag uri: "/test1"))
169
170  ;; XXX: This makes assumptions about the ordering of the docs in the
171  ;; result set.  It should not do that :)
172  (receive (results meta-data)
173    (find-documents base-uri "testnode" phrase: "test")
174    (test "Find-documents finds both docs"
175          '(((#f . "Another ") ("test" . "test") (#f . " for estraier"))
176            ((#f . "Simply a ") ("test" . "test") (#f . " for estraier")))
177          (map car results))
178    (test "URI matches put-document"
179          "/test1"
180          (alist-ref '@uri (cdr (cadr results))))
181    (test "document-uri->id gives result that matches search result details"
182          (alist-ref '@id (cdr (cadr results)))
183          (document-uri->id base-uri "testnode" "/test1")))
184
185  (receive (results meta-data)
186    (find-documents base-uri "testnode" phrase: "test" max: 1)
187    (test "Find-documents honors result 'max limit"
188          '(((#f . "Another ") ("test" . "test") (#f . " for estraier")))
189          (map car results))
190    ;; XXX: This is really quite ugly and could use improvement. How far do we go?
191    (test "Still returns number of hits correctly"
192          (list "2") (alist-ref 'HIT meta-data)))
193
194  (receive (results meta-data)
195    (find-documents base-uri "testnode" attr-phrases: '("my-tag STREQ foo"
196                                             "my-other-tag STREQ whatever"))
197    (test "Find-documents can search attributes"
198          '(((#f . "Another test for estraier")))
199          (map car results))
200    (test-assert "Find-documents can search up to 10 attributes"
201                 (find-documents base-uri "testnode"
202                                 attr-phrases: '("0" "1" "2" "3" "4" "5"
203                                                 "6" "7" "8" "9")))
204    (test-error "Find-documents cannot search more than 10 attributes"
205                (find-documents base-uri "testnode"
206                                attr-phrases: '("0" "1" "2" "3" "4" "5"
207                                                "6" "7" "8" "9" "10"))))
208
209  (test "Deleted documents are not listed"
210        '("/test1")
211        (begin
212          (delete-document base-uri "testnode" uri: "/test2")
213          (map (lambda (l) (alist-ref '@uri l)) (list-documents base-uri "testnode"))))
214 
215  (test "Clearing node results in empty document list"
216        '()
217        (begin (clear-node base-uri "testnode")
218               (list-documents base-uri "testnode"))))
219
220(test-group "cleanup"
221 (test-assert "Clean shutdown" (begin (shutdown-master base-uri) #t))
222 (test-error "After shutdown, server is unreachable" (list-nodes base-uri)))
223(system "rm -rf masterdir")
224
225(test-end)
226
227(unless (zero? (test-failure-count)) (exit 1))
Note: See TracBrowser for help on using the repository browser.