mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-04 16:09:05 +00:00
ce09cd0a4dada4e4d45677f0b68c5ecfdb753aaf
26
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
660dfbabaf |
test: Dashboard Joins and Nested Functions e2e tests (#9685)
### **PR Type**
Tests, Enhancement
---
### **Description**
This PR adds comprehensive E2E tests for Dashboard Joins and Dashboard
Functions features, along with supporting page object helpers.
#### Key Changes:
- **Dashboard Joins Tests**: 8 consolidated multi-panel tests covering
INNER/LEFT/RIGHT joins, conditions, aggregations, field selection,
filters, dynamic operations, persistence, and error handling
- **Dashboard Functions Tests**: 2 multi-panel tests covering basic
(COUNT, COUNT-DISTINCT, AVG, SUM) and advanced (Multiple Y-axis, MIN,
MAX) aggregation functions
- **New `JoinHelper` class**: Provides methods for configuring join
types, streams, conditions, and operators
- **Enhanced `ChartTypeSelector`**: Added Y-axis function configuration
methods and stream selection with retry mechanism
- **Org Context Fix**: Navigate directly to dashboards with
`org_identifier` parameter to ensure correct API context
---
### **Test Coverage**
#### Dashboard Joins Tests (`dashboard-join.spec.js`) - 8 Tests
| # | Test Name | Panels | Coverage | Tags |
|---|-----------|--------|----------|------|
| 1 | Core Join Types - INNER, LEFT, RIGHT | 3 | INNER JOIN (11 rows),
LEFT JOIN (12 rows), RIGHT JOIN (5 rows) | `@dashboard-joins`, `@smoke`,
`@P0` |
| 2 | Join Conditions & Multi-Join | 3 | Multiple AND conditions, 3-way
join, OR conditions | `@dashboard-joins`, `@dashboard-joins-conditions`,
`@P1` |
| 3 | Aggregation Functions | 4 | Basic aggregation, SUM-like grouping,
AVG-like grouping, COUNT grouping | `@dashboard-joins`,
`@dashboard-joins-aggregation`, `@P1` |
| 4 | Field Selection | 4 | response_time_ms, country, bytes, request_id
fields | `@dashboard-joins`, `@dashboard-joins-fields`, `@P2` |
| 5 | Filters & Edge Cases | 6 | Join with filter, LEFT JOIN with NULLs,
session duration, not-equal (!=), greater-than (>), self-join |
`@dashboard-joins`, `@dashboard-joins-filters`, `@P2` |
| 6 | Dynamic Join Operations & UI Validation | 1 | Add/remove joins,
change join types, modify conditions | `@dashboard-joins`,
`@dashboard-joins-dynamic`, `@P2` |
| 7 | Persistence - Save and Reload Dashboard | 1 | Save panel, navigate
away, reload, verify join config persisted | `@dashboard-joins`,
`@dashboard-joins-persistence`, `@P2` |
| 8 | Error Handling & Recovery | 1 | Incomplete join handling, recovery
from invalid state | `@dashboard-joins`, `@dashboard-joins-errors`,
`@P3` |
#### Dashboard Functions Tests (`dashboard-nested-functions.spec.js`) -
2 Tests
| # | Test Name | Panels | Coverage | Tags |
|---|-----------|--------|----------|------|
| 1 | Basic Aggregation Functions | 4 | COUNT, COUNT-DISTINCT, AVG, SUM
functions | `@dashboard-functions`, `@dashboard-functions-basic`, `@P1`
|
| 2 | Advanced Aggregation Functions | 2 | Multiple Y-axis (COUNT + SUM
+ AVG), MIN + MAX functions | `@dashboard-functions`,
`@dashboard-functions-advanced`, `@P2` |
---
### **New Page Object Methods**
#### `JoinHelper` (`dashboard-joins.js`)
| Method | Description |
|--------|-------------|
| `addJoin()` | Open add join popup |
| `selectJoinType(type)` | Select INNER/LEFT/RIGHT/FULL/CROSS join |
| `selectJoinStream(streamName)` | Select stream to join with |
| `selectLeftField(field)` | Select left side join field |
| `selectRightField(field)` | Select right side join field |
| `selectOperator(operator)` | Select =, !=, <, >, <=, >= operator |
| `addCondition()` | Add another join condition |
| `saveJoin()` | Save join configuration |
| `removeJoin(index)` | Remove a join by index |
| `verifyJoinChipVisible(stream, index)` | Verify join chip displays
correctly |
#### `ChartTypeSelector` (`dashboard-chart.js`)
| Method | Description |
|--------|-------------|
| `selectStream(name, retries)` | Select stream with retry mechanism |
| `configureYAxisFunction(alias, func)` | Configure Y-axis aggregation
function |
| `verifyYAxisLabel(alias, func)` | Verify Y-axis label shows function |
| `openYAxisFunctionPopup(alias)` | Open Y-axis configuration popup |
| `selectFunction(name)` | Select aggregation function from dropdown |
#### `DashboardPanelActions` (`dashboard-panel-actions.js`)
| Method | Description |
|--------|-------------|
| `addNextPanel()` | Add another panel after saving |
| `getTableRowCount()` | Get count of data rows in table |
| `verifyChartRenders(expect)` | Verify chart/table renders |
| `savePanel()` | Save panel with networkidle wait |
---
### **Test Data**
Test data files located in `test-data/` directory:
- `joins/test_app_users.json` - 5 user records
- `joins/test_web_requests.json` - 12 web request records
- `joins/test_sessions.json` - 8 session records
- `dashboard-functions/test_records.json` - 7 records with user_name and
score fields
---
### **Fixes Included**
| Issue | Fix |
|-------|-----|
| Org context mismatch on remote environments | Navigate to
`/web/dashboards?org_identifier=${ORGNAME}` |
| Streams not appearing in dropdown | Page reload after dashboard
creation to refresh stream list |
| Save panel race condition | Added `waitForLoadState("networkidle")`
after save click |
| Stream selection timing | Retry mechanism with debug logging |
| Test 5 timeout | Increased to 5 minutes for 6-panel test |
---
<details><summary><h3>File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><details><summary>5
files</summary><table>
<tr>
<td><strong>dashboard-chart.js</strong><dd><code>Enhance stream
selection and add Y-axis function methods</code> </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-573a312576fce62d8e14f2bbb5f9b7d9a552d746304dce3d79862edddd24de76">+106/-14</a></td>
</tr>
<tr>
<td><strong>dashboard-create.js</strong><dd><code>Add smart panel
addition for empty and existing dashboards</code></dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-c3c5add2b934580a91a79bb580634b70e2376b0452113008a0911102db3863e2">+25/-1</a>
</td>
</tr>
<tr>
<td><strong>dashboard-joins.js</strong><dd><code>New JoinHelper for
configuring and validating joins</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-f88eb0cf951ec45e97befde5c83a2c187bb46db3f6cb27bc0cb88d48c5f45b78">+351/-0</a>
</td>
</tr>
<tr>
<td><strong>dashboard-panel-actions.js</strong><dd><code>Add next-panel,
row count and chart render verifications</code> </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-d29713fdcc11cbc93bda29da5261da389226cd718e4292a1c2cd96629f573a80">+76/-1</a>
</td>
</tr>
<tr>
<td><strong>global-setup.js</strong><dd><code>Include org_identifier in
login navigation URL</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-06323dad7214f86b41b62e121e716eeea0054bc4d950c6bcf4a0efe53894acc8">+4/-3</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Tests</strong></td><td><details><summary>6
files</summary><table>
<tr>
<td><strong>dashboard-join.spec.js</strong><dd><code>Consolidated
dashboard joins feature E2E tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-552f4ba6f199ade20dbab2c54b8573422fd644587ed1575262a7aa34f8041174">+1160/-0</a></td>
</tr>
<tr>
<td><strong>dashboard-nested-functions.spec.js</strong><dd><code>Multi-panel
dashboard functions E2E tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-d2a9855da60f5fd3820832815036c368a680e2885033ad1a7a2bcbd060e2a750">+372/-0</a>
</td>
</tr>
<tr>
<td><strong>test_records.json</strong><dd><code>Add test data for
dashboard functions tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-3a09d97f4091ae2f4dc97ebc14199c5d94efb878a6ebfa7da686cad5450ddda0">+7/-0</a>
</td>
</tr>
<tr>
<td><strong>test_app_users.json</strong><dd><code>Add user data for
dashboard joins tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-7c5af3decd88c4f9031fd83282844872f4a0a65eea2b51a46aac849aa4a5c129">+7/-0</a>
</td>
</tr>
<tr>
<td><strong>test_sessions.json</strong><dd><code>Add session data for
dashboard joins tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-836e072600882ffa58662a4867ac17d2ce799dd338daac585203ccaa01275e3c">+10/-0</a>
</td>
</tr>
<tr>
<td><strong>test_web_requests.json</strong><dd><code>Add web request
data for dashboard joins tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-1c4b00b1929e9a01de1cb8129161c49dc1563a5dde1c4b5e770a307245155382">+14/-0</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Configuration
changes</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>cleanup.spec.js</strong><dd><code>Extend cleanup regex for
join and function test streams</code> </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-c214275a512fa285a7e4f2ab61dfcb42d71a0436b0e4241f94d7b45693587983">+8/-1</a>
</td>
</tr>
</table></details></td></tr></tbody></table>
</details>
---
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
|
||
|
|
cc3a6110ae |
test: add ingestion config UI tests (#9643)
### **User description**
- Added IngestionConfigPage POM with 20+ methods for page interactions
- Created 20+ comprehensive tests for ingestion configuration (3 P0, 8
P1, 1 P2)
- Tests cover: Navigation, Copy functionality, Configuration content,
Search
- Fixed all hardcoded waitForTimeout() calls with element-based waits
- Fixed search test selector to use .data-sources-recommended-tabs
.q-tab
- All tests passing (46.3s execution time)
___
### **PR Type**
Tests, Enhancement
___
### **Description**
- Added IngestionConfigPage POM for ingestion interactions
- Introduced comprehensive ingestion configuration tests
- Updated PageManager to include new POM
- Tests cover navigation, copy, content, search
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["PageManager"]
B["IngestionConfigPage POM"]
C["Ingestion config tests"]
A -- "imports" --> B
C -- "uses" --> A
```
<details> <summary><h3> File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>ingestionConfigPage.js</strong><dd><code>Implement
ingestion config page object</code>
</dd></summary>
<hr>
tests/ui-testing/pages/generalPages/ingestionConfigPage.js
<ul><li>Created <code>IngestionConfigPage</code> class<br> <li> Defined
selectors for navigation, tabs, copy, search<br> <li> Implemented
navigation, copy, search, assertion methods<br> <li> Replaced hardcoded
waits with element-based waits</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9643/files#diff-22a47625a9849c4d6b6a0944d864db20d03453666f9cbfaaeb2cf5b57e00d5c5">+147/-0</a>
</td>
</tr>
</table></td></tr><tr><td><strong>Tests</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>page-manager.js</strong><dd><code>Integrate ingestion
config POM</code>
</dd></summary>
<hr>
tests/ui-testing/pages/page-manager.js
<ul><li>Imported <code>IngestionConfigPage</code><br> <li> Added
<code>ingestionConfigPage</code> to <code>PageManager</code>
constructor</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9643/files#diff-565eab8b3c767ae50c9d05e591621d14f66b81af84d6b5ea6efe136c1c3933df">+2/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>ingestion-config.spec.js</strong><dd><code>Add
ingestion configuration tests</code>
</dd></summary>
<hr>
tests/ui-testing/playwright-tests/Ingestion/ingestion-config.spec.js
<ul><li>Added navigation tests for recommended/custom pages<br> <li>
Added copy functionality tests for Fluentd and Prometheus<br> <li> Added
configuration content validation tests<br> <li> Added recommended page
search and filter test</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9643/files#diff-35352597cf8f8ded17cd9c0abac4efb41cb255a1f69f110129a1b0427b4c8870">+159/-0</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
---------
Co-authored-by: Claude <noreply@anthropic.com>
|
||
|
|
7efa71f8ed | test(dashboard): add test cases for table chart JSON mode (#9500) | ||
|
|
52b2759bfa |
test: add INTERSECT and EXCEPT query tests for PR #9544 (#9601)
Added 4 new test cases to verify the join optimization fix: - INTERSECT query: Common user_ids in both streams - EXCEPT query: Users without orders - INTERSECT with WHERE clause: Active users with orders - EXCEPT with multiple columns: Users details without orders Also improved test_joinqueries.py by adding a 3-second sleep after data ingestion to allow proper indexing before querying. Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
bcdc05bca9 |
test: add automated severity color mapping tests for issue #9439 (#9576)
Tests #9439 - Added comprehensive tests for all 8 severity levels (0-7) - Implemented POM methods in logsPage.js for severity color validation - Created test data file with 16 test records (integer and string formats) - Tests verify correct color mapping for each severity level - Includes automatic test stream creation and cleanup - All tests pass successfully with no impact on existing tests --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
6ae38d5ce2 |
test(e2e): refactor pipeline condition tests and fix data ingestion timeout (#9528)
## Summary
Refactored pipeline condition tests into 2 new spec files for better
organization and maintainability, fixed data ingestion timeout issue,
and added comprehensive test coverage for pipeline conditions.
## Changes
- Refactored pipeline condition tests into 2 new spec files for better
organization
- Added 14 new comprehensive test cases (7 UI-based + 7 API-based
validation tests)
- Fixed beforeEach timeout issue by reducing data ingestion from 3,800+
to 10 records per stream
- Added cleanup patterns for `e2e_conditions_*` streams to prevent data
accumulation
- Updated apiCleanup.js to include 7 new stream names in pipeline
cleanup
- Removed outdated comments referencing conditional wait logic
- Added page object methods for condition testing in pipelinesPage.js,
logsPage.js, and streamsPage.js
## Test Coverage
### pipeline-conditions.spec.js (7 tests - all passing ✅)
- Basic condition operations with multiple operators (=, !=, Contains,
NotContains, >=)
- Condition groups, nesting, and reordering
- Field validation and error messages
- Complex operator precedence (A OR B AND C)
- Multiple conditions (A, B, C, D)
- Condition node deletion
- Comparison operators validation
### pipeline-conditions-validation.spec.js (7 tests - API-based)
- Operator precedence validation
- Nested groups with AND/OR logic
- Numeric comparisons
- String operators (case-insensitive Contains)
## Performance
- Reduced test execution time from 180s timeout to ~4.6 minutes for full
suite
- 100% pass rate for active UI tests (7/7)
## Files Changed
- `.github/workflows/playwright.yml` - Updated test configuration
- `tests/test-data/data_100.json` - Added test data for validation tests
- `tests/test-data/sample_pipeline_template.json` - Added pipeline
template
- `tests/ui-testing/pages/apiCleanup.js` - Added stream cleanup patterns
- `tests/ui-testing/pages/pipelinesPages/pipelinesPage.js` - Added
condition testing methods
- `tests/ui-testing/pages/logsPages/logsPage.js` - Added data ingestion
helpers
- `tests/ui-testing/pages/streamsPages/streamsPage.js` - Added stream
management helpers
-
`tests/ui-testing/playwright-tests/Pipelines/pipeline-conditions.spec.js`
- Refactored UI tests
-
`tests/ui-testing/playwright-tests/Pipelines/pipeline-conditions-validation.spec.js`
- New API validation tests
- `tests/ui-testing/playwright-tests/cleanup.spec.js` - Added
e2e_conditions_* pattern
## Testing
All 7 UI-based tests passing with 100% pass rate.
|
||
|
|
8a158884c8 |
test: match_all_camelcase_tests (#9345)
- Verify full camel case token search: DbException should be found when searching for complete camel case identifiers - Verify atomic token search: UserAccountService should be searchable and return matching results for full service class names - Verify XML acronym tokenization: XMLHttpRequest should be properly tokenized and discoverable through match_all queries - Verify camel case with numbers: OAuth2TokenHandlershould handle mixed alphanumeric camel case tokens correctly - Verify multi-word service search:UserManagementService should support complex multi-word camel case service names |
||
|
|
f61b715a1e |
test: Cleanup Mechanism and ENV Runs for e2e tests (#8839)
### **PR Type** Enhancement, Tests ___ ### **Description** - Add robust alerts cleanup utilities - Improve UI flows and resiliency - Support deployed env testing delays - Add CI cleanup and health checks ___ ### Diagram Walkthrough ```mermaid flowchart LR UI["Playwright UI flows hardened"] API["APICleanup cascade (Alerts→Folders→Destinations→Templates)"] CI["CI workflow targets deployed env"] Delay["Configurable test step delay"] Data["Global ingestion more robust"] UI -- "uses" --> API CI -- "runs cleanup.spec" --> API CI -- "health checks + env vars" --> Data Delay -- "slows page ops" --> UI Data -- "ingest logs with parsing" --> UI ``` <details> <summary><h3> File Walkthrough</h3></summary> <table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><details><summary>7 files</summary><table> <tr> <td><strong>alertDestinationsPage.js</strong><dd><code>Add search, cascade-safe delete, bulk prefix cleanup</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-57e5c53b4ef998b3d8708149620ff94dcc46807927f1a3a9e9f28ed3ebe25b0a">+178/-0</a> </td> </tr> <tr> <td><strong>alertTemplatesPage.js</strong><dd><code>Add template search, in-use handling, prefix cleanup</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-f4ebd248b2140051e74dbbbd1aabe344f01c80704ce5857e9c28a04350e018f3">+177/-2</a> </td> </tr> <tr> <td><strong>alertsPage.js</strong><dd><code>Harden alert actions, bulk deletion, search across folders</code></dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-79ee01d6d7f145f19207b93b87143b545a1188cfc6a82bc8c45fecfbf68f8a1d">+280/-9</a> </td> </tr> <tr> <td><strong>apiCleanup.js</strong><dd><code>New API-based cascade cleanup utility</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-537fe76c0d8e26e81c5f77c83bd0ee35daaa973822105c809bf83171a26b33c5">+399/-0</a> </td> </tr> <tr> <td><strong>page-manager.js</strong><dd><code>Wire APICleanup into PageManager</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-565eab8b3c767ae50c9d05e591621d14f66b81af84d6b5ea6efe136c1c3933df">+4/-0</a> </td> </tr> <tr> <td><strong>baseFixtures.js</strong><dd><code>Add configurable test step delay hooks</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-c4c5ee7fbb248d1ab14d3d4e33ffb9626f9aab74c9e0207fcfc08051c8c3c7ee">+46/-0</a> </td> </tr> <tr> <td><strong>global-setup.js</strong><dd><code>Harden login and ingestion with diagnostics</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-06323dad7214f86b41b62e121e716eeea0054bc4d950c6bcf4a0efe53894acc8">+61/-22</a> </td> </tr> </table></details></td></tr><tr><td><strong>Bug fix</strong></td><td><details><summary>1 files</summary><table> <tr> <td><strong>commonActions.js</strong><dd><code>Fix ingestion URLs to use org variable</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-4d726dd2bdb34b2c90a31798ff49b6df5bc952bd049b7c38bebb18b6db0076e2">+4/-4</a> </td> </tr> </table></details></td></tr><tr><td><strong>Tests</strong></td><td><details><summary>4 files</summary><table> <tr> <td><strong>alerts-e2e-flow.spec.js</strong><dd><code>Pre-move folder cleanup and stabilization</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-32972e38c1fe0e8bb887f9f254b3130916a36f96ea924f9987493d44efefeab9">+13/-3</a> </td> </tr> <tr> <td><strong>alerts-import.spec.js</strong><dd><code>Use dedicated invalid import test data</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-62b6ec4818685eacc0a934d68aaadfd73b512ef4f4be25fcd5135b97c2844912">+1/-1</a> </td> </tr> <tr> <td><strong>cleanup.spec.js</strong><dd><code>New pre-test API cleanup spec</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-c214275a512fa285a7e4f2ab61dfcb42d71a0436b0e4241f94d7b45693587983">+29/-0</a> </td> </tr> <tr> <td><strong>invalid-alert.json</strong><dd><code>Add invalid alert sample for import tests</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-c695f71048e9393a45d3e3e3e415696559fecf3ba85712e7c3f366092f53f424">+24/-0</a> </td> </tr> </table></details></td></tr><tr><td><strong>Configuration changes</strong></td><td><details><summary>1 files</summary><table> <tr> <td><strong>playwright.yml</strong><dd><code>Target deployed env; add cleanup job and health checks</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3">+123/-65</a></td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___ |
||
|
|
d70c75e4bc | test: added tests for ent repo - not to be run, but maintained (#8956) | ||
|
|
923348bb43 |
fix: ux changes for logs page (#8790)
### **PR Type** Enhancement, Bug fix, Documentation ___ ### **Description** - Extracted inline styles to scoped SCSS - Improved logs UI/UX and theming - Fixed flicker and pagination UX - Added reusable toolbar and collapse styles ___ ### Diagram Walkthrough ```mermaid flowchart LR SearchBar["SearchBar.vue"] -- "toolbar, toggles, menu UX" --> Styles["New SCSS modules"] IndexList["IndexList.vue"] -- "field list pagination, loading" --> Styles SearchResult["SearchResult.vue"] -- "histogram/table layout refactor" --> Styles Index["Index.vue"] -- "splitter/collapse UX, visualize container" --> Styles TenstackTable["TenstackTable.vue"] -- "table hover/headers theme" --> Styles DetailTable["DetailTable.vue"] -- "wrap toggle, layout" --> Styles History["SearchHistory.vue"] -- "wrap toggle, warning pill" --> Styles Scheduler["SearchSchedulersList.vue"] -- "rounded btn, external styles" --> Styles TransformSel["TransformSelector.vue"] -- "toolbarized toggle, icons" --> Styles FunctionSel["FunctionSelector.vue"] -- "class hooks, styles" --> Styles SyntaxGuide["SyntaxGuide.vue"] -- "dark mode class, ext styles" --> Styles JsonPreview["JsonPreview.vue"] -- "externalized styles" --> Styles App["App.vue"] -- "theme root class" --> AppStyles["app.scss: global scrollbar, collapse btn"] ``` <details> <summary><h3> File Walkthrough</h3></summary> <table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><details><summary>31 files</summary><table> <tr> <td><strong>SearchBar.vue</strong><dd><code>Toolbar/UI cleanup, toggles and menus restyle</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-81893de4edf186b0556f610acb280c87baa2ffe67d3b48a60a866094c7635baf">+272/-585</a></td> </tr> <tr> <td><strong>IndexList.vue</strong><dd><code>Field list pagination UX, loading state, helpers</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-08f058f883b659e713e606991a7ea37ae1ff016b7cccef970489ab5840dc3d09">+133/-419</a></td> </tr> <tr> <td><strong>SearchResult.vue</strong><dd><code>Histogram/table layout classes, external styles</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-5e65533aa4754bb6d0074fda18ffc1ecacded3b9ca6bc28a161c3f6b12f20195">+30/-283</a></td> </tr> <tr> <td><strong>Index.vue</strong><dd><code>Splitter/collapse UX, visualize container cleanup</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-0323c3da69b369843c5d72bf4df5b00ca6b5147192a213baf331659ecf92af62">+99/-57</a> </td> </tr> <tr> <td><strong>DetailTable.vue</strong><dd><code>Wrap toggle restyle and list/table CSS extraction</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-80552b5d25fa6cef9fbbe430b1865d761c4b132284c2d2175afceea8cbabc8c7">+19/-79</a> </td> </tr> <tr> <td><strong>SearchSchedulersList.vue</strong><dd><code>Minor button rounding, moved styles to SCSS</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-0c0a4097c53f07712d35562b1336602bf24faddedab77a9f5717f5582dcac2f1">+2/-137</a> </td> </tr> <tr> <td><strong>TenstackTable.vue</strong><dd><code>Table container class and theming adjustments</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-bc3c669f5ab65a42ae378df1f7d6b35014c9c220790bdcc72b47f55d1385dc22">+5/-104</a> </td> </tr> <tr> <td><strong>SearchHistory.vue</strong><dd><code>Wrap toggle restyle and externalized styles</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-9dd167bd5e272b2057f53c16b905047eec00655a3552daad240a964d67a6f56d">+13/-100</a></td> </tr> <tr> <td><strong>TransformSelector.vue</strong><dd><code>Toolbarized transform toggle and SCSS import</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-0037d8dd9cfbacc26309b26e98ae953e7ccbd0891ac2fd01c6314ebd7eed9d2c">+25/-47</a> </td> </tr> <tr> <td><strong>JsonPreview.vue</strong><dd><code>Moved component styles to shared SCSS</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-3985073134d35ff074742944b114d0905524038b42e6d2ac887fef2c8436fb16">+1/-109</a> </td> </tr> <tr> <td><strong>SyntaxGuide.vue</strong><dd><code>Dark-mode class hook and SCSS extraction</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-c6e8bb651fadd2b15b5b97f5b6069a57813fb97cc3d06eef983af4def33e8806">+5/-67</a> </td> </tr> <tr> <td><strong>FunctionSelector.vue</strong><dd><code>Class hooks and SCSS module inclusion</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-11d9577516700b94b5f3325e77214d0d886473e690db8c9ea981613c9fb89b68">+5/-3</a> </td> </tr> <tr> <td><strong>VisualizeLogsQuery.vue</strong><dd><code>Externalized layout/splitter styles</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-979b01d943d58c5d70faeeac5948b7f02f0b2392a12b84ef07ba7f7393ab0261">+1/-50</a> </td> </tr> <tr> <td><strong>DateTime.vue</strong><dd><code>Rounded buttons and hover feedback</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-c06c96ba750be6fc82f517a53ba809efff8aa619aba203b871d4d2aeb7f64f60">+6/-2</a> </td> </tr> <tr> <td><strong>App.vue</strong><dd><code>Theme root class binding for global styles</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-7322e6842f92edbe4a6e810d63f066ec95e64806d64a02b52e2b9bef2a73db91">+7/-1</a> </td> </tr> <tr> <td><strong>app.scss</strong><dd><code>Global scrollbar, collapse button, toggles polish</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-5703d12504b0395cbfbbfad02a592bc391496026e5f03743102ce06c210ea05f">+142/-2</a> </td> </tr> <tr> <td><strong>search-result.scss</strong><dd><code>New SCSS for search result layout and table</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-e98f726aae49bdd5f8a426c8023eed612f3f33d52b0d458b7730990b3aafc41e">+235/-0</a> </td> </tr> <tr> <td><strong>detail-table.scss</strong><dd><code>New SCSS for detail table and panels</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-63d5673331a5ee1ab792d07831e4a6dbb0d2d40d2ad628652d57944e47a96338">+55/-0</a> </td> </tr> <tr> <td><strong>logs-page.scss</strong><dd><code>New SCSS for logs page structure and splitter</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-3d8458bb7b934b0529dcb35f85e008a4404510435ee4a636ff86e20cfd2970c9">+1401/-0</a></td> </tr> <tr> <td><strong>search-schedulerlist.scss</strong><dd><code>New SCSS for scheduler list views</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-42bbf309982cfcfd1cca270e80a2bddd35947e59dd91f600f5c85788af1e0802">+136/-0</a> </td> </tr> <tr> <td><strong>index-list.scss</strong><dd><code>New SCSS for field/index list</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-0a3be477d7575f8e412bf8092f91901dd1330c8458ebc2b24f96107647cfe200">+139/-0</a> </td> </tr> <tr> <td><strong>search-history.scss</strong><dd><code>New SCSS for search history page</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-01ae0807917e4de78780d9ec549ae2b57e3004e7be72cd77536ac5ae75bda3ed">+97/-0</a> </td> </tr> <tr> <td><strong>transform-selector.scss</strong><dd><code>New SCSS for transform selector controls</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-131c7ba7388ebe94d30b7f42ca12c30b0840a9f8d69622b68e573e829d9fa7d6">+99/-0</a> </td> </tr> <tr> <td><strong>syntax-guide.scss</strong><dd><code>New SCSS for syntax guide dialog</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-7173f5473b8fed57af19a3017f9823e68099745dc181f7996f0024fa8099535c">+78/-0</a> </td> </tr> <tr> <td><strong>tenstack-table.scss</strong><dd><code>New SCSS for data table and resizer</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-0175daf538e52ff95480cb40fadf8e26564474f15e39c5fe2d628f2d7e72aa78">+99/-0</a> </td> </tr> <tr> <td><strong>function-selector.scss</strong><dd><code>New SCSS for function selector</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-16e97b00c534fae20daf24545e4e6a37b83f59e22668eddfd2083c9d778a9032">+58/-0</a> </td> </tr> <tr> <td><strong>visualizelogs-query.scss</strong><dd><code>New SCSS for visualize logs layout</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-263f2af1f510ef9047a88f4cf438ffdc7b22cc598a56071900b898899d5bdab3">+50/-0</a> </td> </tr> <tr> <td><strong>json-preview.scss</strong><dd><code>New SCSS for JSON preview and menus</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-27d0a0d1ec327559e1c09ffec34a7fc937db12580f53d61f10897f378af7d6ff">+17/-0</a> </td> </tr> <tr> <td><strong>quasar-overrides.scss</strong><dd><code>Quasar overrides aligned to new tokens</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-563af58e60b7250169ebe9ced59dfe163a801a106d7f20964a8d20000b320af5">+16/-15</a> </td> </tr> <tr> <td><strong>_variables.scss</strong><dd><code>Variables updated for rem units and theming</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-b3e37ee00c17b89ad1177c5592504277aa645b374095c065ea8b3782df5e89a2">+1/-1</a> </td> </tr> <tr> <td><strong>quasar-variables.sass</strong><dd><code>Quasar variables tuned for new UI</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-bb2b39e6af7e949bef75bce0c7021310c42dd0945c30f963e3c8b599598bfdaa">+2/-2</a> </td> </tr> </table></details></td></tr><tr><td><strong>Documentation</strong></td><td><details><summary>1 files</summary><table> <tr> <td><strong>ui-guidelines.md</strong><dd><code>UI guidelines documentation added</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8790/files#diff-8c5e2f35601f7d06e3389626dd501fc84e694efd6cf0faab6dfaf92445483dfa">+1056/-0</a></td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___ --------- Co-authored-by: Ashish Kolhe <ashish.j.kolhe@gmail.com> Co-authored-by: Shrinath Rao <shnath@openobserve.ai> |
||
|
|
7218fa3439 |
test: e2e-cte-queries (#8070)
### **PR Type**
Tests
___
### **Description**
- Add advanced CTE logs query e2e tests
- Cover strings, NULLs, joins, unions
- Add error-rate and aggregation analysis
- Add complex multi-part query typing/validation
___
### Diagram Walkthrough
```mermaid
flowchart LR
CTEs["Add advanced CTE query tests"]
String["String ops & NULL handling"]
Joins["JOINs and UNIONs"]
Analytics["Error-rate and aggregations"]
Robust["Multi-part typing + validation"]
CTEs -- "new tests" --> String
CTEs -- "new tests" --> Joins
CTEs -- "new tests" --> Analytics
CTEs -- "new tests" --> Robust
```
<details> <summary><h3> File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Tests</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>logsqueries.cte.spec.js</strong><dd><code>Expand CTE
logs e2e coverage with advanced cases</code>
</dd></summary>
<hr>
tests/ui-testing/playwright-tests/Logs/logsqueries.cte.spec.js
<ul><li>Add tests for string manipulation CTEs<br> <li> Add NULL
handling and LEFT JOIN CTE tests<br> <li> Add UNION and error-rate
analysis CTE tests<br> <li> Add complex multi-part CTE with typing and
validation</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8070/files#diff-153f79d86888d9e3a82f42a15242cacb3a126c263aee91cada88ae04dffacd36">+110/-0</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
---------
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
|
||
|
|
8eda4d0bf9 | test: e2e-cte(with-queries)-testcases (#7704) | ||
|
|
5dfc889c18 | test: e2e-match-all-phrase-tests (#7656) | ||
|
|
c2c7ea6a95 |
test: match_all queries pytest (#7208)
### **User description** match_all queries pytest ___ ### **PR Type** Tests ___ ### **Description** - Add tests for match_all streaming queries ___ ### **Changes walkthrough** 📝 <table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Tests</strong></td><td><table> <tr> <td> <details> <summary><strong>test_streaming.py</strong><dd><code>Add match_all streaming test cases</code> </dd></summary> <hr> tests/api-testing/tests/test_streaming.py <li>Added "match_all query one" test case<br> <li> Added "match_all query two" test case<br> <li> Added "match_all query three" test case </details> </td> <td><a href="https://github.com/openobserve/openobserve/pull/7208/files#diff-f15e9b733130f72112380fda658264545435fbf956b08869b0ad5a9435d222f7">+21/-3</a> </td> </tr> </table></td></tr></tr></tbody></table> ___ > <details> <summary> Need help?</summary><li>Type <code>/help how to ...</code> in the comments thread for any questions about PR-Agent usage.</li><li>Check out the <a href="https://qodo-merge-docs.qodo.ai/usage-guide/">documentation</a> for more information.</li></details> --------- Co-authored-by: Taiming Liu <liutaiming3@gmail.com> Co-authored-by: Shrinath Rao <shnath@openobserve.ai> |
||
|
+2 |
0d9f47966b |
feat: Organization revamp (#5579)
Fixes #5131 Addresses #5408 ### Revamp - Created a new table to store organizations in the `organizations` table. Earlier, we never stored organizations in any table, rather we used to store the organizations in the meta table as part of the `user` json. - The users and organization membership relations are now moved to its own separate tables - `users` and `org_users`. ### New changes **API changes** - - `/organizations` - `POST` api to create an org and save it in the meta table. In non-enterprise version, currently only the root user can create the org. For enterprise version with rbac enabled, anyone with `CREATE` access for organizations can create the organization and becomes an admin. Root user can always create an organization. - `/{org_id}/rename` - `PUT` api to rename the existing org. Only root user and the admins of the org can access this API. The payload for following APIs are changed - - `POST api/{org_id}/roles` - `{"name":"new_role"}` is changed to `{"role":"new_role"} - `POST api/{org_id}/users/{user}` - `{"role":"viewer","custom_role":["role_name"]}` is the new payload where `custom_role` is optional and is array of custom roles (only works in enterprise with rbac enabled) which will be assigned to the user. The value of `role` can be standard role or as well as any custom role (when it is custom role, the standard role assigned to the user is decided based on the enterprise env variable - `O2_DEX_DEFAULT_ROLE`). - `POST api/{org_id}/users`- the payload - ``` {"email":"user@user.com","role":"viewer","custom_role":["create_org_permission"],"password":"12345678", "first_name": "", "last_name":""} ``` - `PUT api//{org_id}/users/{email_id}` the payload - ``` {"first_name":"Hello","last_name":"j","role":"viewer","isExternal":false,"change_password":false,"password":"","custom_role":["create_org_permission"]} ``` A new ENV variable is introduced - `ZO_CREATE_ORG_THROUGH_INGESTION` (default `false`) which if true, an org will automatically created when ingesting data to a new org. If false, user can not create org by ingesting data to new org, they need to first call the `POST /organizations` API. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes **New Features** - Added a `cloud` feature for enhanced organizational management capabilities. - Introduced new methods for managing organizational users and asynchronous message processing. - Enhanced user invitation and membership features, including improved role handling. - Implemented configurable ingestion URL support across various components. - Added new functionality for user management and organization handling in the super cluster architecture. **Improvements** - Refined user authentication and authorization processes, including error handling. - Updated database schema to support multi-organization architecture. - Enhanced pagination settings and UI components for better user experience. - Improved handling of organization names and user roles in notifications and alerts. - Streamlined service account token management with visibility enhancements. - Enhanced the `AddUpdateOrganization` component with improved user input handling and validation. - Updated the `AppOrganizations` component to dynamically load the appropriate organization management interface. - Improved the `ServiceAccountsList` component with updated pagination options and token handling logic. **Bug Fixes** - Resolved issues with user role assignments and organization management inconsistencies. - Corrected routing and navigation logic for login and logout processes. - Addressed various error handling scenarios in user and organization processes. - Fixed issues with the visibility of service account options in the `EditGroup` and `EditRole` components based on the cloud configuration. **Breaking Changes** - Significant restructuring of user and organization data models. - Changes to authentication workflows and configuration handling. - Removal of certain components related to user and organization management. - Updated the logic for determining the ingestion URL across various components. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Yashodhan Joshi <yjdoc2@gmail.com> Co-authored-by: Bhargav <BJP232004@GMAIL.COM> Co-authored-by: Taiming Liu <liutaiming3@gmail.com> Co-authored-by: hengfei yang <hengfei.yang@gmail.com> Co-authored-by: harshiv-7 <harshiv@openobserve.ai> Co-authored-by: Huaijin <haohuaijin@gmail.com> Co-authored-by: Zhao.wei <weizhao029@gmail.com> Co-authored-by: ShyamOOAI <shyam@openobserve.ai> Co-authored-by: oasisk <ashish.j.kolhe@gmail.com> Co-authored-by: sai nikhil kethe <nikhil@openobserve.ai> Co-authored-by: Yashodhan Joshi <yashodhan@openobserve.ai> Co-authored-by: Yashodhan Joshi <yjdoc2@gmail.com> |
||
|
|
dbd6c1017b | test(dashboard): add geomap and map test cases (#6722) | ||
|
|
c3364cbab0 |
test: Import destination alert playwright (#6631)
1. Import webhook and email destination 2. Import scheduled and realtime alert --------- Co-authored-by: Taiming Liu <liutaiming3@gmail.com> |
||
|
|
e8f348819e |
test: Import Template Destination Alerts Playwright (#6205)
1. Import webhook and email Template --------- Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com> |
||
|
|
f9a4b65641 | test(dashboards): add import test cases (#6399) | ||
|
|
e3f685898b |
test: e2e-custom-charts (#6007)
Co-authored-by: sai nikhil kethe <nikhil@openobserve.ai> |
||
|
|
505bd69aa3 |
test: e2e-enrichment-bulkapi-pytest (#5371)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Introduced end-to-end testing for bulk ingestion with comprehensive coverage. - Enhanced functionality for managing enrichment tables, including adding, uploading, and deleting entries. - **Bug Fixes** - Improved error handling and user interaction checks in the enrichment table upload process. - **Tests** - Added multiple new test cases for enrichment table functionality, including upload and error handling scenarios. - Updated existing test cases for consistency and improved logic. - **Chores** - Standardized import statements and improved overall test structure for clarity. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
aded5ce3cf |
test: enrichment table testcase (#5313)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Introduced a new test case for uploading enrichment tables, enhancing pipeline functionality validation. - **Bug Fixes** - Improved error handling for required fields in existing tests. - **Tests** - Organized and structured existing test cases for better execution flow and added wait times for asynchronous operations. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
8fb58346a1 |
test: pytest-join-queries testcases (#5128)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Introduced a new JSON file for SQL join query test cases, enhancing the variety and coverage of tests. - Added multiple new test cases for various SQL join operations, improving testing capabilities. - **Bug Fixes** - Improved error handling in data ingestion steps to ensure successful test execution. - **Refactor** - Transitioned from hardcoded test data to a parameterized approach for better maintainability and flexibility in testing. - Updated method signature to streamline test parameters. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
f5412c7528 |
test: added multiple float queries in pytest under alert and logs (#4909)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Added end-to-end tests for creating alerts based on SQL and float values. - Introduced a page object model for unflattened logs to streamline UI interactions. - Implemented a function to toggle quick mode in the test suite. - **Bug Fixes** - Enhanced error handling and validation in alert tests. - Improved reliability of tests by ensuring UI elements are visible before interactions. - **Refactor** - Refactored Playwright tests to utilize the `UnflattenedPage` object for better maintainability. - Consolidated parameters in fetch requests for clarity. - **Chores** - Removed redundant tests from the alert test suite to improve clarity and maintainability. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
d6ab1a9933 |
test: inverted index testcases (#3920)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Tests** - Added end-to-end test functions to validate SQL query handling. - Introduced new log entry for end-to-end test tracking. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
d686481569 |
test: prepopulate the amount of data for each test #3000 (#3031)
Created a fixture which will be available during scope=session. This will ingest data present in tests/test-data/logs_data.json to org_pytest_data and stream_pytest_data API Tests positive and negative scenarios - - Search without payload - Search with valid sql query - search with invalid sql query - search with limit and sql query - valid histogram query - histogram query with limit --------- Co-authored-by: Neha P <neha@openobserve.ai> Co-authored-by: Neha P <144308844+neha00290@users.noreply.github.com> |