(require | |
'[cemerick.url :as url] | |
'[clojure.spec.alpha :as s] | |
'[clojure.spec.gen.alpha :as sgen]) | |
(defn non-empty-string-alphanumeric | |
[] | |
(sgen/such-that #(not= "" %) | |
(sgen/string-alphanumeric))) | |
(defn url-gen | |
"Generator for generating URLs; note that it may generate | |
http URLs on port 443 and https URLs on port 80, and only | |
uses alphanumerics" | |
[] | |
(sgen/fmap | |
(partial apply (comp str url/->URL)) | |
(sgen/tuple | |
;; protocol | |
(sgen/elements #{"http" "https"}) | |
;; username | |
(sgen/string-alphanumeric) | |
;; password | |
(sgen/string-alphanumeric) | |
;; host | |
(sgen/string-alphanumeric) | |
;; port | |
(sgen/choose 1 65535) | |
;; path | |
(sgen/fmap #(->> % | |
(interleave (repeat "/")) | |
(apply str)) | |
(sgen/not-empty | |
(sgen/vector | |
(non-empty-string-alphanumeric)))) | |
;; query | |
(sgen/map | |
(non-empty-string-alphanumeric) | |
(non-empty-string-alphanumeric) | |
{:max-elements 2}) | |
;; anchor | |
(sgen/string-alphanumeric)))) | |
(s/def ::url (s/with-gen | |
(s/and string? | |
#(try | |
(url/url %) | |
(catch Throwable t false))) | |
url-gen)) | |
(sgen/generate (url-gen)) | |
(s/valid? ::url "http://conan.is") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
ioRekz commentedJan 15, 2018
Added this gist to https://github.com/ioRekz/spectator👍