import React, { useState } from 'react'; import { expect } from 'chai'; import { render, cleanup, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import HadronDocument from 'hadron-document'; import Document from './document'; const EditableDoc = ({ doc }) => { const [editing, setEditing] = useState(false); return ( { setEditing(true); }} > ); }; describe('Document', function () { let doc: HadronDocument; beforeEach(function () { doc = new HadronDocument({ str: 'abc', num: 123, date: new Date(0), null_value: null, }); }); afterEach(cleanup); it('should render HadronDocument keys and values', function () { render(); expect(screen.getByText('str')).to.exist; expect(screen.getByTitle('abc')).to.exist; expect(screen.getByText('num')).to.exist; expect(screen.getByTitle('123')).to.exist; expect(screen.getByText('date')).to.exist; expect(screen.getByTitle('1970-01-01T00:00:00.000+00:00')).to.exist; }); describe('edit mode', function () { it('should change element key name on edit', function () { render(); const el = document.querySelector( `[data-id="${doc.get('str').uuid}"]` ); const keyEditor = within(el).getByTestId('hadron-document-key-editor'); userEvent.clear(keyEditor); userEvent.keyboard('new_name'); userEvent.tab(); expect(screen.getByDisplayValue('new_name')).to.exist; expect(doc.get('new_name').key).to.eq('str'); expect(doc.get('new_name').currentKey).to.eq('new_name'); }); it('should change element string value on edit', function () { render(); const el = document.querySelector( `[data-id="${doc.get('str').uuid}"]` ); const valueEditor = within(el).getByTestId( 'hadron-document-value-editor' ); userEvent.clear(valueEditor); userEvent.keyboard('bla'); userEvent.tab(); expect(doc.get('str').currentValue).to.eq('bla'); expect(doc.get('str').currentType).to.eq('String'); }); it('should change element number value on edit', function () { render(); const el = document.querySelector( `[data-id="${doc.get('num').uuid}"]` ); const valueEditor = within(el).getByTestId( 'hadron-document-value-editor' ); userEvent.clear(valueEditor); userEvent.keyboard('321'); userEvent.tab(); expect(doc.get('num').currentValue.valueOf()).to.eq(321); expect(doc.get('num').currentType).to.eq('Int32'); }); it('should change element date value on edit', function () { render(); const el = document.querySelector( `[data-id="${doc.get('date').uuid}"]` ); const valueEditor = within(el).getByTestId( 'hadron-document-value-editor' ); userEvent.clear(valueEditor); userEvent.keyboard('2000-01-01'); userEvent.tab(); expect((doc.get('date').currentValue as Date).toISOString()).to.eq( '2000-01-01T00:00:00.000Z' ); expect(doc.get('date').currentType).to.eq('Date'); }); it('should change element type on edit', function () { render(); const el = document.querySelector( `[data-id="${doc.get('num').uuid}"]` ); const typeEditor = within(el).getByTestId('hadron-document-type-editor'); userEvent.selectOptions(typeEditor, 'String'); userEvent.tab(); expect(doc.get('num').currentValue.valueOf()).to.eq('123'); expect(doc.get('num').currentType).to.eq('String'); }); }); it('should render decrypted fields specially', function () { const obj = { _id: 0, key1: 'a', key2: 'b', key3: 'c', [Symbol.for('@@mdb.decryptedKeys')]: ['key1', 'key2'], }; doc = new HadronDocument(obj); render(); expect(screen.getAllByTitle('Encrypted Field')).to.have.lengthOf(2); }); it('should allow editing the null value (COMPASS-5697)', function () { render(); const el = document.querySelector( `[data-id="${doc.get('null_value').uuid}"]` ); const typeEditor = within(el).getByTestId('hadron-document-type-editor'); userEvent.selectOptions(typeEditor, 'String'); userEvent.tab(); const valueEditor = within(el).getByTestId('hadron-document-value-editor'); userEvent.clear(valueEditor); userEvent.keyboard('foo bar'); userEvent.tab(); expect(doc.get('null_value').currentValue.valueOf()).to.eq('foo bar'); expect(doc.get('null_value').currentType).to.eq('String'); }); it('should autofocus key editor when double-clicking key', function () { render(); const el = document.querySelector( `[data-id="${doc.get('str').uuid}"]` ); userEvent.dblClick(within(el).getByTestId('hadron-document-clickable-key')); const editor = within(el).getByTestId('hadron-document-key-editor'); expect(editor).to.eq(document.activeElement); }); it('should autofocus value editor when double-clicking value', function () { render(); const el = document.querySelector( `[data-id="${doc.get('str').uuid}"]` ); userEvent.dblClick( within(el).getByTestId('hadron-document-clickable-value') ); const editor = within(el).getByTestId('hadron-document-value-editor'); expect(editor).to.eq(document.activeElement); }); it('should autofocus type editor when double-clicking a non-editable value', function () { render(); const el = document.querySelector( `[data-id="${doc.get('null_value').uuid}"]` ); userEvent.dblClick( within(el).getByTestId('hadron-document-clickable-value') ); const editor = within(el).getByTestId('hadron-document-type-editor'); expect(editor).to.eq(document.activeElement); }); it('should render doc in expanded/collapsed mode when the entire doc is expanded/collapsed', function () { const hadronDoc = new HadronDocument({ names: { firstName: 'A', lastName: 'B', }, }); hadronDoc.expand(); render(); expect(screen.getByText('names')).to.exist; expect(screen.getByText('firstName')).to.exist; expect(screen.getByText('lastName')).to.exist; hadronDoc.collapse(); expect(() => screen.getByText('firstName')).to.throw; expect(() => screen.getByText('lastName')).to.throw; }); });