(.module: [lux #* ["_" test (#+ Test)] [abstract [monad (#+ do)]] [control ["." try (#+ Try)] [concurrency ["." promise (#+ Promise)]]] [data ["." binary {[0 #test] ["_#" /]}]] [math ["." random]]] {#program ["." / ["/#" // #_ ["#." artifact (#+ Artifact) ["#/." extension]]]]} {#test ["_." // #_ ["#." artifact]]}) (def: #export (spec valid-identity valid-artifact invalid-identity invalid-artifact subject) (-> /.Identity Artifact /.Identity Artifact (/.Repository Promise) Test) (do random.monad [expected (_binary.random 100)] (wrap ($_ _.and' (do promise.monad [upload!/good (:: subject upload valid-identity valid-artifact //artifact/extension.lux-library expected) download!/good (:: subject download valid-artifact //artifact/extension.lux-library) upload!/bad (:: subject upload invalid-identity invalid-artifact //artifact/extension.lux-library expected) download!/bad (:: subject download invalid-artifact //artifact/extension.lux-library)] (_.claim [/.Repository] (and (case [upload!/good download!/good] [(#try.Success _) (#try.Success actual)] (:: binary.equivalence = expected actual) _ false) (case [upload!/bad download!/bad] [(#try.Failure _) (#try.Failure _)] true _ false)))) ))))