<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andrii Miroshnychenko</title>
    <description>The latest articles on DEV Community by Andrii Miroshnychenko (@andrewmiroshnichenko).</description>
    <link>https://dev.to/andrewmiroshnichenko</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F902326%2Ff6532c59-81a0-4bf8-b3ea-c55b2e96a47e.jpeg</url>
      <title>DEV Community: Andrii Miroshnychenko</title>
      <link>https://dev.to/andrewmiroshnichenko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andrewmiroshnichenko"/>
    <language>en</language>
    <item>
      <title>Share complex style configs with styled-components</title>
      <dc:creator>Andrii Miroshnychenko</dc:creator>
      <pubDate>Fri, 24 Feb 2023 22:09:09 +0000</pubDate>
      <link>https://dev.to/andrewmiroshnichenko/share-complex-style-configs-with-styled-components-29jf</link>
      <guid>https://dev.to/andrewmiroshnichenko/share-complex-style-configs-with-styled-components-29jf</guid>
      <description>&lt;p&gt;Recently on a project we worked on the new set of form components for internal library.&lt;br&gt;
Our stack includes &lt;code&gt;styled-components&lt;/code&gt; and I want to share an approach, which might be useful for someone. No knowledge behind basics (&lt;code&gt;styled&lt;/code&gt; and &lt;code&gt;css&lt;/code&gt; utilities) of aforementioned library is needed.&lt;/p&gt;

&lt;p&gt;Let's say we have an input component, with border and border-radius configured. We assume that it can resemble complex structure, so we'll use simple div as a wrapper&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;StyledInputContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  border: 1px solid black;
  border-radius: 4px;
`&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StyledInputContainer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
           &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;  // Just for illustrative purposes, we won't build real Input here
         &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;StyledInputContainer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fine. What if we want to allow user to remove value by clicking on cross button? We can add it to our Input&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gi"&gt;+ const StyledClearButton = styled.button`
+   // other styles for button
+  `
&lt;/span&gt;
const StyledInputContainer = styled.div`
  border: 1px solid black;
  border-radius: 4px;
&lt;span class="gi"&gt;+  display: flex;
+  justify-content: space-between;
&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;

&lt;span class="p"&gt;const Input = () =&amp;gt; {
&lt;/span&gt;  return &amp;lt;StyledInputContainer&amp;gt;
           &amp;lt;input /&amp;gt;
 +         &amp;lt;StyledClearButton&amp;gt;X&amp;lt;/StyledClearButton&amp;gt; 
         &amp;lt;/StyledInputContainer&amp;gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Having button hanging all the time in the input might be distracting for user, we can show it only if container is hovered.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;const StyledClearButton = styled.button`
&lt;/span&gt;&lt;span class="gi"&gt;+   visibility: hidden;
&lt;/span&gt;    // other styles for button
&lt;span class="err"&gt;`&lt;/span&gt;

&lt;span class="p"&gt;const StyledInputContainer = styled.div`
&lt;/span&gt;  border: 1px solid black;
  border-radius: 4px;
  display: flex;

+  &amp;amp;:hover {                     
&lt;span class="gi"&gt;+    ${StyledClearButton} {    // Way to create css cascade
+      visibility: visible;
+    }
+  }
&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;

&lt;span class="p"&gt;const Input = () =&amp;gt; {
&lt;/span&gt;  return &amp;lt;StyledInputContainer&amp;gt;
           &amp;lt;input /&amp;gt;
           &amp;lt;StyledClearButton&amp;gt;X&amp;lt;/StyledClearButton&amp;gt; 
         &amp;lt;/StyledInputContainer&amp;gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the button will be visible only if container is hovered.&lt;br&gt;
We can even add props to this setup. For example, if our input has errors, we want it to have red border.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;const StyledClearButton = styled.button`
&lt;/span&gt;   visibility: hidden;
   // other styles for button
&lt;span class="err"&gt;`&lt;/span&gt;

&lt;span class="p"&gt;const StyledInputContainer = styled.div`
&lt;/span&gt;&lt;span class="gd"&gt;-  border: 1px solid black;
&lt;/span&gt;&lt;span class="gi"&gt;+  border: 1px solid ${props.error ? 'red' : 'black'};
&lt;/span&gt;  border-radius: 4px;
  display: flex;

  &amp;amp;:hover {                     
    ${StyledClearButton} {
      visibility: visible;
    }
  }
&lt;span class="err"&gt;`&lt;/span&gt;

&lt;span class="p"&gt;const Input = () =&amp;gt; {
&lt;/span&gt;&lt;span class="gi"&gt;+ // error state is handled here
&lt;/span&gt;&lt;span class="gd"&gt;- return &amp;lt;StyledInputContainer&amp;gt;
&lt;/span&gt;&lt;span class="gi"&gt;+ return &amp;lt;StyledInputContainer error={error}&amp;gt;
&lt;/span&gt;           &amp;lt;input /&amp;gt;
           &amp;lt;StyledClearButton&amp;gt;X&amp;lt;/StyledClearButton&amp;gt; 
         &amp;lt;/StyledInputContainer&amp;gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Until now it was pretty common development path for &lt;code&gt;styled-components&lt;/code&gt; adoption. But here is the tricky part. In a very different module we want to have a &lt;code&gt;TextArea&lt;/code&gt; component, which will have same border, border-radius (background color, hover/active states, etc.) as our &lt;code&gt;Input&lt;/code&gt;. But it shouldn't have &lt;code&gt;ClearButton&lt;/code&gt;. So the question is - how to exploit what is reusable here?&lt;br&gt;
Answer is simple - put common part to the function and use it to populate different styled wrappers. We can do it first for the &lt;code&gt;Input&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;const StyledClearButton = styled.button`
&lt;/span&gt;   visibility: hidden;
   // other styles for button
&lt;span class="err"&gt;`&lt;/span&gt;

&lt;span class="gi"&gt;+ export const getCommonInputStyles = (props, closeButtonCmp) =&amp;gt; css`
+   border: 1px solid ${props.error ? 'red' : 'black'};
+   border-radius: 4px;
+   ${closeButtonCmp &amp;amp;&amp;amp; css`
+     &amp;amp;:hover {                     
+       ${closeButtonCmp} {
+         visibility: visible;
+       }
+     }
+   `}
+ `
&lt;/span&gt;
const StyledInputContainer = styled.div`
&lt;span class="gd"&gt;-  border: 1px solid ${props.error ? 'red' : 'black'};
-  border-radius: 4px;
&lt;/span&gt;   display: flex;

-  &amp;amp;:hover {                     
&lt;span class="gd"&gt;-   ${StyledClearButton} {
-     visibility: visible;
-   }
- }
&lt;/span&gt;&lt;span class="gi"&gt;+  ${props =&amp;gt; getCommonInputStyles(props, StyledClearButton)}
&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;

&lt;span class="p"&gt;const Input = () =&amp;gt; {
&lt;/span&gt; // error state is handled here
 return &amp;lt;StyledInputContainer&amp;gt;
 return &amp;lt;StyledInputContainer error={error}&amp;gt;
           &amp;lt;input /&amp;gt;
           &amp;lt;StyledClearButton&amp;gt;X&amp;lt;/StyledClearButton&amp;gt; 
         &amp;lt;/StyledInputContainer&amp;gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now we can use extracted styles in whatever else component we want. Like mentioned above TextArea&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;StyledTextAreaContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;getCommonInputStyles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;
`&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TextArea&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="c1"&gt;// error state is handled here&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StyledTextAreaContainer&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
           &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;textarea&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
         &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;StyledTextAreaContainer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see that since TextArea doesn't contain clear button we passing it to &lt;code&gt;getCommonInputStyles&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That's it. I hope you'll find it useful in your daily work with such great library as &lt;code&gt;styled-components&lt;/code&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Testing events attached to HTML Document</title>
      <dc:creator>Andrii Miroshnychenko</dc:creator>
      <pubDate>Sun, 21 Aug 2022 11:22:14 +0000</pubDate>
      <link>https://dev.to/andrewmiroshnichenko/testing-events-attached-to-html-document-4o9o</link>
      <guid>https://dev.to/andrewmiroshnichenko/testing-events-attached-to-html-document-4o9o</guid>
      <description>&lt;h2&gt;
  
  
  Component
&lt;/h2&gt;

&lt;p&gt;Recently I was working on tests for one of our React components, which implements dropdown functionality. With appropriate prop enabled, it allows dropdown items to be collapsed on "outside" (anywhere on the page) click. Code for this part was similar to&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onOutsideClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setIsOpen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onOutsideClick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onOutsideClick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, event listener is attached directly to &lt;code&gt;document&lt;/code&gt; object, which is a reference to &lt;a href="https://www.w3schools.com/jsref/dom_obj_document.asp"&gt;HTML Document&lt;/a&gt;. &lt;em&gt;It is not a DOM node, which is important.&lt;/em&gt; Overall, addition of event listener to &lt;code&gt;document&lt;/code&gt; is a wide used practice when you want to ensure your callback be fired on any place on the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test setup
&lt;/h2&gt;

&lt;p&gt;We are using React Testing Library to test our components. It encourages to work with components/features as user would've work with them. As a consequence, it's better to avoid doing things which aren't natural to your app user flow.&lt;br&gt;
&lt;del&gt;Unfortunately while dealing with &lt;code&gt;document&lt;/code&gt; it's necessary to break this rule.&lt;/del&gt; Main (and only) RTL's method of rendering test markup is &lt;code&gt;render&lt;/code&gt; which build whole tree starting from dedicated DOM node, &lt;code&gt;document.body&lt;/code&gt; by default.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AppComponent&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// Which equals to&lt;/span&gt;
&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AppComponent&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;baseElement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Code below won't work because document isn't a node&lt;/span&gt;
&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AppComponent&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;baseElement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can alter it by adjusting &lt;code&gt;baseElement&lt;/code&gt; option of &lt;code&gt;render&lt;/code&gt; method, but still it has to be DOM node. It's not possible to build a tree on top of &lt;code&gt;document&lt;/code&gt; object itself.&lt;br&gt;
This means opened dropdown won't be closed on click, because &lt;code&gt;document&lt;/code&gt; object isn't simulated by testing library and no events will be issued.&lt;/p&gt;
&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;First idea that I was thinking of was to hide dropdown by clicking on its anchor (our implementation allows to do so).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// Initially options are not mounted in the tree&lt;/span&gt;
    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Option three&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toBeInTheDocument&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;// This is dropdown anchor, click on it shows options to choose from&lt;/span&gt;
    &lt;span class="nx"&gt;fireEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Selected: Option one&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;// Third option is now visible (and mounted)&lt;/span&gt;
    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Option three&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toBeVisible&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;// "Technical" click, which won't be conducted by user under normal circumstances&lt;/span&gt;
    &lt;span class="nx"&gt;fireEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Selected: Option one&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;// Third option is now unmounted again&lt;/span&gt;
    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Option three&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toBeInTheDocument&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Despite being a working solution, this adds some unnatural flow to test and can potentially influence dropdown state in unpredictable manner.&lt;/p&gt;

&lt;p&gt;Most preferable workaround (from those left on the table) is to simulate &lt;code&gt;click&lt;/code&gt; event on the document object. This will cause callbacks to be triggered and won't require any additional user-related actions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// Initially options are not mounted in the tree&lt;/span&gt;
    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Option three&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toBeInTheDocument&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;// This is dropdown anchor, click on it shows options to choose from&lt;/span&gt;
    &lt;span class="nx"&gt;fireEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Selected: Option one&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;// Third option is now visible (and mounted)&lt;/span&gt;
    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Option three&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toBeVisible&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;act&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Direct call on document API&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="c1"&gt;// Third option is now unmounted again&lt;/span&gt;
    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Option three&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toBeInTheDocument&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;I hope this small investigation will help you in your daily work with RTL :)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>testing</category>
      <category>react</category>
    </item>
  </channel>
</rss>
