import {
  ALLOWED_DOMAINS,
  onShouldStartLoadWithRequest,
} from "components/FullPageWebView/FullPageWebView";
import { Linking } from "react-native";

describe( "FullPageWebView", ( ) => {
  describe( "onShouldStartLoadWithRequest", ( ) => {
    it( "should approve a request for the source url", ( ) => {
      const url = "https://www.inaturalist.org";
      const request = { url };
      const source = { uri: url };
      const routeParams = { initialUrl: url };
      expect( onShouldStartLoadWithRequest( request, source, routeParams ) ).toBeTruthy();
    } );

    it( "should approve a request for an anchor on the source url", ( ) => {
      const url = "https://www.inaturalist.org";
      const request = { url: `${url}#something` };
      const source = { uri: url };
      const routeParams = { initialUrl: url };
      expect( onShouldStartLoadWithRequest( request, source, routeParams ) ).toBeTruthy();
    } );

    describe( "external browser", ( ) => {
      beforeEach( ( ) => {
        Linking.openURL.mockImplementation( jest.fn( _url => Promise.resolve() ) );
      } );

      afterEach( ( ) => Linking.openURL.mockReset( ) );

      it( "should try to open for any domain not on the allowlist", ( ) => {
        const url = "https://www.inaturalist.org";
        const request = { url: "https://www.ebird.org" };
        expect( ALLOWED_DOMAINS ).not.toContain( "ebird.org" );
        const source = { uri: url };
        const routeParams = { initialUrl: url };
        expect( onShouldStartLoadWithRequest( request, source, routeParams ) ).toBeFalsy();
        expect( Linking.openURL ).toHaveBeenCalledWith( request.url );
      } );

      it( "should not try to open for any domain on the allowlist", ( ) => {
        const url = "https://www.inaturalist.org";
        const request = { url: "https://www.donorbox.org" };
        expect( ALLOWED_DOMAINS ).toContain( "donorbox.org" );
        const source = { uri: url };
        const routeParams = { initialUrl: url, handleLinksForAllowedDomains: true };
        expect( onShouldStartLoadWithRequest( request, source, routeParams ) ).toBeTruthy();
        expect( Linking.openURL ).not.toHaveBeenCalled( );
      } );

      it( "should try to open for any domain on the allowlist for clicks", ( ) => {
        const url = "https://www.inaturalist.org";
        const request = { url: "https://www.inaturalist.org/users/edit", navigationType: "click" };
        const source = { uri: url };
        const routeParams = { initialUrl: url };
        expect( onShouldStartLoadWithRequest( request, source, routeParams ) ).toBeFalsy();
        expect( Linking.openURL ).toHaveBeenCalledWith( request.url );
      } );

      it( "should not try to open for pathnames specified in params on click", ( ) => {
        const url = "https://www.inaturalist.org";
        const request = { url: "https://www.inaturalist.org/users/delete", navigationType: "click" };
        expect( ALLOWED_DOMAINS ).toContain( "inaturalist.org" );
        const source = { uri: url };
        const routeParams = { initialUrl: url, clickablePathnames: ["/users/delete"] };
        expect( onShouldStartLoadWithRequest( request, source, routeParams ) ).toBeTruthy();
        expect( Linking.openURL ).not.toHaveBeenCalled( );
      } );
    } );

    describe( "setSource", ( ) => {
      it( "should update the source when navigating the top frame", ( ) => {
        const url = "https://www.inaturalist.org";
        const destination = "https://www.inaturalist.org/observations";
        const request = {
          url: destination,
          mainDocumentURL: destination,
          isTopFrame: true,
        };
        const source = { uri: url };
        const routeParams = { initialUrl: url };
        const setSource = jest.fn();

        expect(
          onShouldStartLoadWithRequest( request, source, routeParams, setSource ),
        ).toBeTruthy();
        expect( setSource ).toHaveBeenCalledWith( { ...source, uri: destination } );
      } );

      it( "should not update the source for iframe requests", ( ) => {
        const url = "https://www.inaturalist.org";
        const iframeUrl = "https://www.inaturalist.org/embed";
        const request = {
          url: iframeUrl,
          mainDocumentURL: url,
          isTopFrame: false,
        };
        const source = { uri: url };
        const routeParams = { initialUrl: url };
        const setSource = jest.fn();

        expect(
          onShouldStartLoadWithRequest( request, source, routeParams, setSource ),
        ).toBeTruthy();
        expect( setSource ).not.toHaveBeenCalled();
      } );
    } );
  } );
} );
