Back
as-lower-maps (clj)
(source)function
(as-lower-maps rs opts)
Given a `ResultSet` and options, return a `RowBuilder` / `ResultSetBuilder`
that produces bare vectors of hash map rows, with lower-case keys.
Examples
next-jdbc
What's left to be tested:
* ReadableColumn protocol extension point"
(:require [clojure.core.protocols :as core-p]
[clojure.datafy :as d]
[clojure.string :as str]
[clojure.test :refer [deftest is testing use-fixtures]]
[next.jdbc.protocols :as p]
[next.jdbc.result-set :as rs]
[next.jdbc.specs :as specs]
[next.jdbc.test-fixtures :refer [with-test-db ds column
default-options
derby? mssql? mysql? postgres?]])
(:import (java.sql ResultSet ResultSetMetaData)))
(deftest test-map-row-builder
(testing "default row builder"
(let [row (p/-execute-one (ds)
["select * from fruit where id = ?" 1]
(default-options))]
(is (map? row))
(is (contains? row (column :FRUIT/GRADE)))
(is (nil? ((column :FRUIT/GRADE) row)))
(is (= 1 ((column :FRUIT/ID) row)))
(is (= "Apple" ((column :FRUIT/NAME) row))))
(let [rs (p/-execute-all (ds)
["select * from fruit order by id"]
(default-options))]
(is (every? map? rs))
(is (= 1 ((column :FRUIT/ID) (first rs))))
(is (= "Apple" ((column :FRUIT/NAME) (first rs))))
(is (= 4 ((column :FRUIT/ID) (last rs))))
(is (= "Orange" ((column :FRUIT/NAME) (last rs))))))
(testing "unqualified row builder"
(let [row (p/-execute-one (ds)
["select * from fruit where id = ?" 2]
{:builder-fn rs/as-unqualified-maps})]
(is (map? row))
(is (contains? row (column :COST)))
(is (nil? ((column :COST) row)))
(is (= 2 ((column :ID) row)))
(is (= "Banana" ((column :NAME) row)))))
(testing "lower-case row builder"
(let [row (p/-execute-one (ds)
["select * from fruit where id = ?" 3]
(assoc (default-options)
:builder-fn rs/as-lower-maps))]
(is (map? row))
(is (contains? row :fruit/appearance))
(is (nil? (:fruit/appearance row)))
(is (= 3 (:fruit/id row)))
(is (= "Peach" (:fruit/name row)))))
(testing "unqualified lower-case row builder"
(let [row (p/-execute-one (ds)
["select * from fruit where id = ?" 4]
{:builder-fn rs/as-unqualified-lower-maps})]
(is (map? row))
(is (= 4 (:id row)))
(is (= "Orange" (:name row)))))
(testing "kebab-case row builder"
(let [row (p/-execute-one (ds)
["select id,name,appearance as looks_like from fruit where id = ?" 3]
(assoc (default-options)
:builder-fn rs/as-kebab-maps))]
(is (map? row))
(is (contains? row :fruit/looks-like))
(is (nil? (:fruit/looks-like row)))
(is (= 3 (:fruit/id row)))
(is (= "Peach" (:fruit/name row)))))
(testing "unqualified kebab-case row builder"
(let [row (p/-execute-one (ds)
["select id,name,appearance as looks_like from fruit where id = ?" 4]
{:builder-fn rs/as-unqualified-kebab-maps})]
(is (map? row))
(is (contains? row :looks-like))
(is (= "juicy" (:looks-like row)))
(is (= 4 (:id row)))
(is (= "Orange" (:name row)))))
(testing "custom row builder 1"
(let [row (p/-execute-one (ds)
["select fruit.*, id + 100 as newid from fruit where id = ?" 3]
(assoc (default-options)
:builder-fn rs/as-modified-maps
:label-fn str/lower-case
:qualifier-fn identity))]
(is (map? row))
(is (contains? row (column :FRUIT/appearance)))
(is (nil? ((column :FRUIT/appearance) row)))
(is (= 3 ((column :FRUIT/id) row)))
(is (= 103 (:newid row))) ; no table name here
(is (= "Peach" ((column :FRUIT/name) row)))))
(testing "custom row builder 2"
(let [row (p/-execute-one (ds)
["select fruit.*, id + 100 as newid from fruit where id = ?" 3]
(assoc (default-options)
:builder-fn rs/as-modified-maps
:label-fn str/lower-case
:qualifier-fn (constantly "vegetable")))]
(is (map? row))
(is (contains? row :vegetable/appearance))
(is (nil? (:vegetable/appearance row)))
(is (= 3 (:vegetable/id row)))
(is (= 103 (:vegetable/newid row))) ; constant qualifier here
(is (= "Peach" (:vegetable/name row)))))
(testing "adapted row builder"
(let [row (p/-execute-one (ds)
["select * from fruit where id = ?" 3]
(assoc
(default-options)
:builder-fn (rs/as-maps-adapter
rs/as-modified-maps
(fn [^ResultSet rs
^ResultSetMetaData rsmeta
^Integer i]
(condp = (.getColumnType rsmeta i)
java.sql.Types/VARCHAR
(.getString rs i)
java.sql.Types/INTEGER
(.getLong rs i)
(.getObject rs i))))
:label-fn str/lower-case
:qualifier-fn identity))]
(is (map? row))
(is (contains? row (column :FRUIT/appearance)))
(is (nil? ((column :FRUIT/appearance) row)))
(is (= 3 ((column :FRUIT/id) row)))
(is (= "Peach" ((column :FRUIT/name) row))))
(let [builder (rs/as-maps-adapter
rs/as-modified-maps
(fn [^ResultSet rs _ ^Integer i]
(.getObject rs i)))
row (p/-execute-one (ds)
["select * from fruit where id = ?" 3]
(assoc
(default-options)
:builder-fn (rs/as-maps-adapter
builder
(fn [^ResultSet rs
^ResultSetMetaData rsmeta
^Integer i]
(condp = (.getColumnType rsmeta i)
java.sql.Types/VARCHAR
(.getString rs i)
java.sql.Types/INTEGER
(.getLong rs i)
(.getObject rs i))))
:label-fn str/lower-case
:qualifier-fn identity))]
(is (map? row))
(is (contains? row (column :FRUIT/appearance)))
(is (nil? ((column :FRUIT/appearance) row)))
(is (= 3 ((column :FRUIT/id) row)))
(is (= "Peach" ((column :FRUIT/name) row))))))
souenzzo/atemoia
(ns atemoia.server-test
(:require [atemoia.server :as atemoia]
[cheshire.core :as json]
[clojure.test :refer [deftest is]]
[io.pedestal.http :as http]
[io.pedestal.test :refer [response-for]]
[next.jdbc :as jdbc]
[next.jdbc.result-set :as rs]))
(deftest hello
(let [atm-conn (jdbc/with-options (jdbc/get-connection {:jdbcUrl "jdbc:h2:mem:"})
{:builder-fn rs/as-lower-maps})
service-fn (-> {::atemoia/atm-conn atm-conn}
atemoia/create-service
http/dev-interceptors
http/create-servlet
::http/service-fn)]
(atemoia/install-schema {::atemoia/atm-conn atm-conn})
(is (= []
(-> service-fn
(response-for :get "/todo")
:body
(json/parse-string true)))
"fetching todos before creating")
(is (= 201
(-> service-fn
(response-for :post "/todo"
:body (json/generate-string {:note "hello world"}))
:status))
"creating a todo")
(is (= [{:todo/id 1
:todo/note "hello world"}]
(-> service-fn
(response-for :get "/todo")
:body
(json/parse-string true)))
"fetching the todos, after creating one")
(dotimes [idx 10]
(is (= 201
(-> service-fn
(response-for :post "/todo"
:body (json/generate-string {:note (str "hello world" idx)}))
:status))
(str "creating many todos: idx = " idx)))
(is (== 10
(-> service-fn
(response-for :get "/todo")
:body
(json/parse-string true)
count))
"fetching many todos")))