Skip to content

Commit

Permalink
Merge pull request #51 from typesense/tests
Browse files Browse the repository at this point in the history
Add tests
  • Loading branch information
karakhanyans authored Feb 27, 2023
2 parents f8105a5 + d4197e6 commit bfb43f8
Show file tree
Hide file tree
Showing 11 changed files with 537 additions and 4 deletions.
52 changes: 52 additions & 0 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Pull Request

on:
pull_request:
branches: [master]

jobs:
tests:
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
matrix:
node-version: [16.x]
typesense-version: [0.24.0]
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
submodules: 'recursive'

- name: Start Typesense
uses: jirevwe/typesense-github-action@v1.0.1
with:
typesense-version: ${{ matrix.typesense-version }}
typesense-port: 8108
typesense-api-key: xyz

- name: Composer Validate
run: composer validate

- name: Cache Composer Packages
id: composer-cache
uses: actions/cache@v2
with:
path: vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-
- name: Cache dependencies
uses: actions/cache@v2
with:
path: |
~/.npm
key: ${{ runner.os }}-node-${{ matrix.node-version }}-${{ hashFiles('**/package-lock.json') }}

- name: Install Dependencies
run: |
composer update --prefer-dist --no-interaction --no-progress
- name: Run Tests
run: vendor/bin/phpunit tests
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
.tmp
/composer.lock
vendor
.phpunit.result.cache
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ $searchRequests = [
]
];

Todo::searchMulti($searchRequests)->paginateRaw();
Todo::search('')->searchMulti($searchRequests)->paginateRaw();
```

### Generate Scoped Search Key
Expand Down
13 changes: 10 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"minimum-stability": "stable",
"autoload": {
"psr-4": {
"Typesense\\LaravelTypesense\\": "src/"
"Typesense\\LaravelTypesense\\": "src/",
"Typesense\\LaravelTypesense\\Tests\\": "tests/"
}
},
"extra": {
Expand All @@ -47,18 +48,24 @@
"illuminate/pagination": "^7.0|^8.0|^9.0|^10.0",
"illuminate/queue": "^7.0|^8.0|^9.0|^10.0",
"illuminate/support": "^7.0|^8.0|^9.0|^10.0",
"typesense/typesense-php": "^4.0"
"typesense/typesense-php": "^4.0",
"symfony/http-client": "^5.4"
},
"config": {
"platform": {
"php": "8.0"
},
"allow-plugins": {
"pestphp/pest-plugin": true,
"php-http/discovery": true
}
},
"suggest": {
"typesense/typesense-php": "Required to use the Typesense php client."
},
"require-dev": {
"phpunit/phpunit": "^8.0|^9.0",
"mockery/mockery": "^1.3"
"mockery/mockery": "^1.3",
"orchestra/testbench": "^6.17|^7.0|^8.0"
}
}
163 changes: 163 additions & 0 deletions config/scout.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
<?php

return [

/*
|--------------------------------------------------------------------------
| Default Search Engine
|--------------------------------------------------------------------------
|
| This option controls the default search connection that gets used while
| using Laravel Scout. This connection is used when syncing all models
| to the search service. You should adjust this based on your needs.
|
| Supported: "algolia", "meilisearch", "database", "collection", "null"
|
*/

'driver' => env('SCOUT_DRIVER', 'typesense'),

/*
|--------------------------------------------------------------------------
| Index Prefix
|--------------------------------------------------------------------------
|
| Here you may specify a prefix that will be applied to all search index
| names used by Scout. This prefix may be useful if you have multiple
| "tenants" or applications sharing the same search infrastructure.
|
*/

'prefix' => env('SCOUT_PREFIX', ''),

/*
|--------------------------------------------------------------------------
| Queue Data Syncing
|--------------------------------------------------------------------------
|
| This option allows you to control if the operations that sync your data
| with your search engines are queued. When this is set to "true" then
| all automatic data syncing will get queued for better performance.
|
*/

'queue' => env('SCOUT_QUEUE', false),

/*
|--------------------------------------------------------------------------
| Database Transactions
|--------------------------------------------------------------------------
|
| This configuration option determines if your data will only be synced
| with your search indexes after every open database transaction has
| been committed, thus preventing any discarded data from syncing.
|
*/

'after_commit' => false,

/*
|--------------------------------------------------------------------------
| Chunk Sizes
|--------------------------------------------------------------------------
|
| These options allow you to control the maximum chunk size when you are
| mass importing data into the search engine. This allows you to fine
| tune each of these chunk sizes based on the power of the servers.
|
*/

'chunk' => [
'searchable' => 500,
'unsearchable' => 500,
],

/*
|--------------------------------------------------------------------------
| Soft Deletes
|--------------------------------------------------------------------------
|
| This option allows to control whether to keep soft deleted records in
| the search indexes. Maintaining soft deleted records can be useful
| if your application still needs to search for the records later.
|
*/

'soft_delete' => false,

/*
|--------------------------------------------------------------------------
| Identify User
|--------------------------------------------------------------------------
|
| This option allows you to control whether to notify the search engine
| of the user performing the search. This is sometimes useful if the
| engine supports any analytics based on this application's users.
|
| Supported engines: "algolia"
|
*/

'identify' => env('SCOUT_IDENTIFY', false),

/*
|--------------------------------------------------------------------------
| Algolia Configuration
|--------------------------------------------------------------------------
|
| Here you may configure your Algolia settings. Algolia is a cloud hosted
| search engine which works great with Scout out of the box. Just plug
| in your application ID and admin API key to get started searching.
|
*/

'algolia' => [
'id' => env('ALGOLIA_APP_ID', ''),
'secret' => env('ALGOLIA_SECRET', ''),
],

/*
|--------------------------------------------------------------------------
| MeiliSearch Configuration
|--------------------------------------------------------------------------
|
| Here you may configure your MeiliSearch settings. MeiliSearch is an open
| source search engine with minimal configuration. Below, you can state
| the host and key information for your own MeiliSearch installation.
|
| See: https://docs.meilisearch.com/guides/advanced_guides/configuration.html
|
*/

'meilisearch' => [
'host' => env('MEILISEARCH_HOST', 'http://localhost:7700'),
'key' => env('MEILISEARCH_KEY', null),
'index-settings' => [
// 'users' => [
// 'filterableAttributes'=> ['id', 'name', 'email'],
// ],
],
],

'typesense' => [
'api_key' => 'xyz',
'nodes' => [
[
'host' => 'localhost',
'port' => '8108',
'path' => '',
'protocol' => 'http',
],
],
'nearest_node' => [
'host' => 'localhost',
'port' => '8108',
'path' => '',
'protocol' => 'http',
],
'connection_timeout_seconds' => 2,
'healthcheck_interval_seconds' => 30,
'num_retries' => 3,
'retry_interval_seconds' => 1,
],
];
23 changes: 23 additions & 0 deletions phpunit.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true"
>
<testsuites>
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory>
</testsuite>
</testsuites>
<coverage processUncoveredFiles="true">
<include>
<directory suffix=".php">./app</directory>
<directory suffix=".php">./src</directory>
</include>
</coverage>
<php>
<env name="APP_ENV" value="testing"/>
<env name="APP_KEY" value="AckfSECXIvnK5r28GVIWUAxmbBSjTsmF"/>
<env name="DB_CONNECTION" value="testing"/>
</php>
</phpunit>
93 changes: 93 additions & 0 deletions tests/Feature/MultiSearchTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?php

namespace Typesense\LaravelTypesense\Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Typesense\LaravelTypesense\Tests\Fixtures\SearchableUserModel;
use Typesense\LaravelTypesense\Tests\TestCase;

class MultiSearchTest extends TestCase
{
use RefreshDatabase;

protected function defineDatabaseMigrations()
{
$this->setUpFaker();
$this->loadLaravelMigrations();

SearchableUserModel::create([
'name' => 'Laravel Typsense',
'email' => 'typesense@example.com',
'password' => bcrypt('password'),
]);
SearchableUserModel::create([
'name' => 'Laravel Typsense',
'email' => 'fake@example.com',
'password' => bcrypt('password'),
]);
SearchableUserModel::create([
'name' => 'Laravel Typsense',
'email' => 'test@example.com',
'password' => bcrypt('password'),
]);
}

public function testSearchByEmail()
{
$searchRequests = [
[
'collection' => 'users',
'q' => 'Laravel Typsense'
],
[
'collection' => 'users',
'q' => 'typesense@example.com'
]
];

$response = SearchableUserModel::search('')->searchMulti($searchRequests)->paginateRaw();

$this->assertCount(2, $response->items()['results']);
$this->assertEquals(3, $response->items()['results'][0]['found']);
$this->assertEquals("test@example.com", $response->items()['results'][0]['hits'][0]['document']['email']);

}

public function testSearchByName()
{
$searchRequests = [
[
'collection' => 'users',
'q' => 'Laravel Typsense'
],
[
'collection' => 'users',
'q' => 'typesense@example.com'
]
];

$response = SearchableUserModel::search('')->searchMulti($searchRequests)->paginateRaw();

$this->assertCount(2, $response->items()['results']);
$this->assertEquals(1, $response->items()['results'][1]['found']);
$this->assertEquals("typesense@example.com", $response->items()['results'][1]['hits'][0]['document']['email']);
}

public function testSearchByWrongQueryParams()
{
$searchRequests = [
[
'collection' => 'users',
'q' => 'Wrong Params'
],
[
'collection' => 'users',
'q' => 'wrong@example.com'
]
];

$response = SearchableUserModel::search('')->searchMulti($searchRequests)->paginateRaw();
$this->assertEquals(0, $response->items()['results'][0]['found']);
$this->assertEquals(0, $response->items()['results'][1]['found']);
}
}
Loading

0 comments on commit bfb43f8

Please sign in to comment.