Skip to content

Commit 0b434e0

Browse files
committed
add moar tests
1 parent c1b3ed2 commit 0b434e0

26 files changed

Lines changed: 497 additions & 111 deletions

.credo.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
#
9595
## Readability Checks
9696
#
97-
{Credo.Check.Readability.AliasOrder, []},
97+
# {Credo.Check.Readability.AliasOrder, []},
9898
{Credo.Check.Readability.FunctionNames, []},
9999
{Credo.Check.Readability.LargeNumbers, []},
100100
{Credo.Check.Readability.MaxLineLength, [priority: :low, max_length: 120]},

.github/workflows/ci.yml

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ jobs:
2020
test:
2121
runs-on: ubuntu-latest
2222

23+
env:
24+
MIX_ENV: test
25+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
26+
LATEST_TYPESENSE: '27.1'
27+
2328
strategy:
2429
matrix:
2530
include:
@@ -48,10 +53,6 @@ jobs:
4853
elixir: '1.17'
4954
lint: true
5055

51-
env:
52-
MIX_ENV: test
53-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
54-
5556
services:
5657
typesense:
5758
image: typesense/typesense:${{ matrix.typesense }}
@@ -68,7 +69,10 @@ jobs:
6869
-v /tmp/typesense-data:/data \
6970
typesense/typesense:${{ matrix.typesense}} \
7071
--api-key=xyz \
71-
--data-dir /data \
72+
--data-dir=/data \
73+
--enable-search-analytics=true \
74+
--analytics-dir=/analytics-data \
75+
--analytics-flush-interval=60 \
7276
--enable-cors
7377
7478
- name: Curl Typesense
@@ -86,9 +90,9 @@ jobs:
8690
path: |
8791
deps
8892
_build
89-
key: ${{ runner.os }}-mix-typesense-${{ matrix.typesense}}-${{ matrix.otp}}-${{ matrix.elixir}}-${{ hashFiles('**/mix.lock') }}
93+
key: ${{ runner.os }}-typesense-${{ matrix.typesense}}-${{ matrix.otp}}-${{ matrix.elixir}}-mix-${{ hashFiles('**/mix.lock') }}
9094
restore-keys: |
91-
${{ runner.os }}-mix-typesense-${{ matrix.typesense}}
95+
${{ runner.os }}-typesense-${{ matrix.typesense}}-${{ matrix.otp }}-${{ matrix.elixir }}-mix-
9296
9397
- name: Install Dependencies
9498
run: |
@@ -115,12 +119,13 @@ jobs:
115119
run: mix credo --all --strict
116120
if: ${{ matrix.lint }}
117121

118-
- name: Check format files
119-
run: mix format --check-formatted
120-
if: ${{ matrix.lint }}
122+
# - name: Check format files
123+
# run: mix format --check-formatted
124+
# if: ${{ matrix.lint }}
121125

122126
- name: Run tests
123-
run: mix test
127+
run: mix test --only ${{ matrix.typesense }} --trace
124128

125129
- name: Post test coverage to Coveralls
126130
run: mix coveralls.github
131+
if: ${{ matrix.typesense == env.LATEST_TYPESENSE }}

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,32 @@
11
# OpenApiTypesense
22

3+
[![Hex.pm](https://img.shields.io/hexpm/v/open_api_typesense)](https://hex.pm/packages/open_api_typesense)
4+
[![Hexdocs.pm](https://img.shields.io/badge/hex-docs-lightgreen.svg)](https://hexdocs.pm/open_api_typesense)
5+
[![Hex.pm](https://img.shields.io/hexpm/l/open_api_typesense)](https://hexdocs.pm/open_api_typesense/license.html)
6+
[![Typesense badge](https://img.shields.io/badge/Typesense-v27.1-darkblue)](https://typesense.org/docs/27.1/api)
7+
[![Coverage Status](https://coveralls.io/repos/github/jaeyson/open_api_typesense/badge.svg?branch=main)](https://coveralls.io/github/jaeyson/open_api_typesense?branch=main)
8+
39
## TODO
410
- Custom Http client adapter (currently [`Req`](https://hexdocs.pm/req))
511
- Tests for each modules not completed yet.
12+
- Where to consume `opts`:
13+
```elixir
14+
def take_snapshot(conn \\ Connection.new(), opts \\ []) do
15+
client = opts[:client] || @default_client
16+
query = Keyword.take(opts, [:snapshot_path])
17+
18+
client.request(conn, %{
19+
args: [],
20+
call: {OpenApiTypesense.Operations, :take_snapshot},
21+
url: "/operations/snapshot",
22+
method: :post,
23+
query: query,
24+
response: [{201, {OpenApiTypesense.SuccessStatus, :t}}],
25+
opts: opts # <-- TODO
26+
})
27+
end
28+
```
29+
630

731
## Installation
832

config/config.exs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ if Mix.env() == :dev do
1313
default: [
1414
output: [
1515
base_module: OpenApiTypesense,
16+
processor: OpenAPI.Processor,
17+
renderer: OpenAPI.Renderer,
1618
location: "lib/open_api_typesense",
1719
operation_subdirectory: "operations/",
1820
schema_subdirectory: "schemas/"

coveralls.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"skip_files": [
33
"test",
4-
"deps"
4+
"deps",
5+
"lib/open_api_typesense/schemas"
56
]
67
}

docker-compose.yml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
services:
22
typesense:
3-
image: docker.io/typesense/typesense:27.1
3+
# image: docker.io/typesense/typesense:27.1
4+
image: docker.io/typesense/typesense:0.25.2
5+
# image: docker.io/typesense/typesense:26.0
46
container_name: typesense
57
restart: on-failure
68
ports:
79
- 8107:8107 # internal status
810
- 8108:8108 # typesense server
911
volumes:
1012
- ./typesense-data:/data
11-
command: "--data-dir /data --api-key=xyz --enable-cors"
13+
command: |
14+
--data-dir=/data
15+
--api-key=xyz
16+
--enable-search-analytics=true
17+
--analytics-dir=/analytics-data
18+
--analytics-flush-interval=60
19+
--enable-cors
1220
typesense_dashboard:
1321
image: ghcr.io/bfritscher/typesense-dashboard:1.9.3
1422
container_name: typesense_dashboard

lib/open_api_typesense/client.ex

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ defmodule OpenApiTypesense.Client do
107107
host: conn.host,
108108
port: conn.port,
109109
path: opts[:url],
110-
query: URI.encode_query(opts[:opts] || %{})
110+
query: URI.encode_query(opts[:query] || %{})
111111
}
112112

113113
{_req, resp} =
@@ -144,6 +144,12 @@ defmodule OpenApiTypesense.Client do
144144
parse_values(code, values, resp.body)
145145
end
146146

147+
defp parse_values(code, :map, body) when is_map(body) do
148+
status = if code in 200..299, do: :ok, else: :error
149+
150+
{status, body}
151+
end
152+
147153
defp parse_values(code, values, body) when is_list(values) do
148154
status = if code in 200..299, do: :ok, else: :error
149155

lib/open_api_typesense/operations/analytics.ex

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ defmodule OpenApiTypesense.Analytics do
33
Provides API endpoints related to analytics
44
"""
55

6+
alias OpenApiTypesense.Connection
7+
68
@default_client OpenApiTypesense.Client
79

810
@doc """
@@ -62,13 +64,13 @@ defmodule OpenApiTypesense.Analytics do
6264
6365
Permanently deletes an analytics rule, given it's name
6466
"""
65-
@spec delete_analytics_rule(String.t(), keyword) ::
67+
@spec delete_analytics_rule(Connection.t(), String.t(), keyword) ::
6668
{:ok, OpenApiTypesense.AnalyticsRuleDeleteResponse.t()}
6769
| {:error, OpenApiTypesense.ApiResponse.t()}
68-
def delete_analytics_rule(ruleName, opts \\ []) do
70+
def delete_analytics_rule(conn \\ Connection.new(), ruleName, opts \\ []) do
6971
client = opts[:client] || @default_client
7072

71-
client.request(%{
73+
client.request(conn, %{
7274
args: [ruleName: ruleName],
7375
call: {OpenApiTypesense.Analytics, :delete_analytics_rule},
7476
url: "/analytics/rules/#{ruleName}",
@@ -86,13 +88,13 @@ defmodule OpenApiTypesense.Analytics do
8688
8789
Retrieve the details of an analytics rule, given it's name
8890
"""
89-
@spec retrieve_analytics_rule(String.t(), keyword) ::
91+
@spec retrieve_analytics_rule(Connection.t(), String.t(), keyword) ::
9092
{:ok, OpenApiTypesense.AnalyticsRuleSchema.t()}
9193
| {:error, OpenApiTypesense.ApiResponse.t()}
92-
def retrieve_analytics_rule(ruleName, opts \\ []) do
94+
def retrieve_analytics_rule(conn \\ Connection.new(), ruleName, opts \\ []) do
9395
client = opts[:client] || @default_client
9496

95-
client.request(%{
97+
client.request(conn, %{
9698
args: [ruleName: ruleName],
9799
call: {OpenApiTypesense.Analytics, :retrieve_analytics_rule},
98100
url: "/analytics/rules/#{ruleName}",
@@ -110,12 +112,12 @@ defmodule OpenApiTypesense.Analytics do
110112
111113
Retrieve the details of all analytics rules
112114
"""
113-
@spec retrieve_analytics_rules(keyword) ::
115+
@spec retrieve_analytics_rules(Connection.t(), keyword) ::
114116
{:ok, OpenApiTypesense.AnalyticsRulesRetrieveSchema.t()} | :error
115-
def retrieve_analytics_rules(opts \\ []) do
117+
def retrieve_analytics_rules(conn \\ Connection.new(), opts \\ []) do
116118
client = opts[:client] || @default_client
117119

118-
client.request(%{
120+
client.request(conn, %{
119121
args: [],
120122
call: {OpenApiTypesense.Analytics, :retrieve_analytics_rules},
121123
url: "/analytics/rules",

lib/open_api_typesense/operations/collections.ex

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ defmodule OpenApiTypesense.Collections do
3737
@doc """
3838
Delete an alias
3939
"""
40-
@spec delete_alias(String.t(), keyword) ::
40+
@spec delete_alias(Connection.t(), String.t(), keyword) ::
4141
{:ok, OpenApiTypesense.CollectionAlias.t()} | {:error, OpenApiTypesense.ApiResponse.t()}
42-
def delete_alias(aliasName, opts \\ []) do
42+
def delete_alias(conn \\ Connection.new(), aliasName, opts \\ []) do
4343
client = opts[:client] || @default_client
4444

45-
client.request(%{
45+
client.request(conn, %{
4646
args: [aliasName: aliasName],
4747
call: {OpenApiTypesense.Collections, :delete_alias},
4848
url: "/aliases/#{aliasName}",
@@ -171,13 +171,18 @@ defmodule OpenApiTypesense.Collections do
171171
172172
Update a collection's schema to modify the fields and their types.
173173
"""
174-
@spec update_collection(String.t(), OpenApiTypesense.CollectionUpdateSchema.t(), keyword) ::
174+
@spec update_collection(
175+
Connection.t(),
176+
String.t(),
177+
OpenApiTypesense.CollectionUpdateSchema.t(),
178+
keyword
179+
) ::
175180
{:ok, OpenApiTypesense.CollectionUpdateSchema.t()}
176181
| {:error, OpenApiTypesense.ApiResponse.t()}
177-
def update_collection(collectionName, body, opts \\ []) do
182+
def update_collection(conn \\ Connection.new(), collectionName, body, opts \\ []) do
178183
client = opts[:client] || @default_client
179184

180-
client.request(%{
185+
client.request(conn, %{
181186
args: [collectionName: collectionName, body: body],
182187
call: {OpenApiTypesense.Collections, :update_collection},
183188
url: "/collections/#{collectionName}",
@@ -198,12 +203,17 @@ defmodule OpenApiTypesense.Collections do
198203
199204
Create or update a collection alias. An alias is a virtual collection name that points to a real collection. If you're familiar with symbolic links on Linux, it's very similar to that. Aliases are useful when you want to reindex your data in the background on a new collection and switch your application to it without any changes to your code.
200205
"""
201-
@spec upsert_alias(String.t(), OpenApiTypesense.CollectionAliasSchema.t(), keyword) ::
206+
@spec upsert_alias(
207+
Connection.t(),
208+
String.t(),
209+
OpenApiTypesense.CollectionAliasSchema.t(),
210+
keyword
211+
) ::
202212
{:ok, OpenApiTypesense.CollectionAlias.t()} | {:error, OpenApiTypesense.ApiResponse.t()}
203-
def upsert_alias(aliasName, body, opts \\ []) do
213+
def upsert_alias(conn \\ Connection.new(), aliasName, body, opts \\ []) do
204214
client = opts[:client] || @default_client
205215

206-
client.request(%{
216+
client.request(conn, %{
207217
args: [aliasName: aliasName, body: body],
208218
call: {OpenApiTypesense.Collections, :upsert_alias},
209219
url: "/aliases/#{aliasName}",

lib/open_api_typesense/operations/curation.ex

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ defmodule OpenApiTypesense.Curation do
33
Provides API endpoints related to curation
44
"""
55

6+
alias OpenApiTypesense.Connection
7+
68
@default_client OpenApiTypesense.Client
79

810
@doc """
@@ -30,12 +32,12 @@ defmodule OpenApiTypesense.Curation do
3032
@doc """
3133
List all collection overrides
3234
"""
33-
@spec get_search_overrides(String.t(), keyword) ::
35+
@spec get_search_overrides(Connection.t(), String.t(), keyword) ::
3436
{:ok, OpenApiTypesense.SearchOverridesResponse.t()} | :error
35-
def get_search_overrides(collectionName, opts \\ []) do
37+
def get_search_overrides(conn \\ Connection.new(), collectionName, opts \\ []) do
3638
client = opts[:client] || @default_client
3739

38-
client.request(%{
40+
client.request(conn, %{
3941
args: [collectionName: collectionName],
4042
call: {OpenApiTypesense.Curation, :get_search_overrides},
4143
url: "/collections/#{collectionName}/overrides",

0 commit comments

Comments
 (0)