-module(gleam@uri_test). -compile(no_auto_import). -export([full_parse_test/0, parse_only_path_test/0, parse_only_host_test/0, error_parsing_uri_test/0, full_uri_to_string_test/0, path_only_uri_to_string_test/0, parse_query_string_test/0, parse_empty_query_string_test/0, error_parsing_query_test/0, query_to_string_test/0, empty_query_to_string_test/0, parse_segments_test/0, origin_test/0, merge_test/0]). full_parse_test() -> {ok, Parsed} = gleam@uri:parse( <<"https://foo:bar@example.com:1234/path?query=true#fragment"/utf8>> ), gleam@should:equal(erlang:element(2, Parsed), {some, <<"https"/utf8>>}), gleam@should:equal(erlang:element(3, Parsed), {some, <<"foo:bar"/utf8>>}), gleam@should:equal( erlang:element(4, Parsed), {some, <<"example.com"/utf8>>} ), gleam@should:equal(erlang:element(5, Parsed), {some, 1234}), gleam@should:equal(erlang:element(6, Parsed), <<"/path"/utf8>>), gleam@should:equal( erlang:element(7, Parsed), {some, <<"query=true"/utf8>>} ), gleam@should:equal(erlang:element(8, Parsed), {some, <<"fragment"/utf8>>}). parse_only_path_test() -> {ok, Parsed} = gleam@uri:parse(<<""/utf8>>), gleam@should:equal(erlang:element(2, Parsed), none), gleam@should:equal(erlang:element(3, Parsed), none), gleam@should:equal(erlang:element(4, Parsed), none), gleam@should:equal(erlang:element(5, Parsed), none), gleam@should:equal(erlang:element(6, Parsed), <<""/utf8>>), gleam@should:equal(erlang:element(7, Parsed), none), gleam@should:equal(erlang:element(8, Parsed), none). parse_only_host_test() -> {ok, Parsed} = gleam@uri:parse(<<"//"/utf8>>), gleam@should:equal(erlang:element(2, Parsed), none), gleam@should:equal(erlang:element(3, Parsed), none), gleam@should:equal(erlang:element(4, Parsed), {some, <<""/utf8>>}), gleam@should:equal(erlang:element(5, Parsed), none), gleam@should:equal(erlang:element(6, Parsed), <<""/utf8>>), gleam@should:equal(erlang:element(7, Parsed), none), gleam@should:equal(erlang:element(8, Parsed), none). error_parsing_uri_test() -> gleam@should:equal(gleam@uri:parse(<<"::"/utf8>>), {error, nil}). full_uri_to_string_test() -> TestUri = {uri, {some, <<"https"/utf8>>}, {some, <<"foo:bar"/utf8>>}, {some, <<"example.com"/utf8>>}, {some, 1234}, <<"/path"/utf8>>, {some, <<"query=true"/utf8>>}, {some, <<"fragment"/utf8>>}}, gleam@should:equal( gleam@uri:to_string(TestUri), <<"https://foo:bar@example.com:1234/path?query=true#fragment"/utf8>> ). path_only_uri_to_string_test() -> TestUri = {uri, none, none, none, none, <<"/"/utf8>>, none, none}, gleam@should:equal(gleam@uri:to_string(TestUri), <<"/"/utf8>>). parse_query_string_test() -> {ok, Parsed} = gleam@uri:parse_query(<<"foo+bar=1&city=%C3%B6rebro"/utf8>>), gleam@should:equal( Parsed, [{<<"foo bar"/utf8>>, <<"1"/utf8>>}, {<<"city"/utf8>>, <<"örebro"/utf8>>}] ). parse_empty_query_string_test() -> {ok, Parsed} = gleam@uri:parse_query(<<""/utf8>>), gleam@should:equal(Parsed, []). error_parsing_query_test() -> gleam@should:equal(gleam@uri:parse_query(<<"%C2"/utf8>>), {error, nil}). query_to_string_test() -> QueryString = gleam@uri:query_to_string( [{<<"foo bar"/utf8>>, <<"1"/utf8>>}, {<<"city"/utf8>>, <<"örebro"/utf8>>}] ), gleam@should:equal(QueryString, <<"foo+bar=1&city=%C3%B6rebro"/utf8>>). empty_query_to_string_test() -> QueryString = gleam@uri:query_to_string([]), gleam@should:equal(QueryString, <<""/utf8>>). parse_segments_test() -> gleam@should:equal(gleam@uri:path_segments(<<"/"/utf8>>), []), gleam@should:equal( gleam@uri:path_segments(<<"/foo/bar"/utf8>>), [<<"foo"/utf8>>, <<"bar"/utf8>>] ), gleam@should:equal(gleam@uri:path_segments(<<"////"/utf8>>), []), gleam@should:equal( gleam@uri:path_segments(<<"/foo//bar"/utf8>>), [<<"foo"/utf8>>, <<"bar"/utf8>>] ), gleam@should:equal(gleam@uri:path_segments(<<"/."/utf8>>), []), gleam@should:equal( gleam@uri:path_segments(<<"/.foo"/utf8>>), [<<".foo"/utf8>>] ), gleam@should:equal( gleam@uri:path_segments(<<"/../bar"/utf8>>), [<<"bar"/utf8>>] ), gleam@should:equal( gleam@uri:path_segments(<<"../bar"/utf8>>), [<<"bar"/utf8>>] ), gleam@should:equal( gleam@uri:path_segments(<<"/foo/../bar"/utf8>>), [<<"bar"/utf8>>] ). origin_test() -> {ok, Parsed} = gleam@uri:parse(<<"http://example.test/path?foo#bar"/utf8>>), gleam@should:equal( gleam@uri:origin(Parsed), {ok, <<"http://example.test"/utf8>>} ), {ok, Parsed1} = gleam@uri:parse(<<"http://example.test:8080"/utf8>>), gleam@should:equal( gleam@uri:origin(Parsed1), {ok, <<"http://example.test:8080"/utf8>>} ), {ok, Parsed2} = gleam@uri:parse(<<"https://example.test"/utf8>>), gleam@should:equal( gleam@uri:origin(Parsed2), {ok, <<"https://example.test"/utf8>>} ), {ok, Parsed3} = gleam@uri:parse(<<"http:///path"/utf8>>), gleam@should:equal(gleam@uri:origin(Parsed3), {ok, <<"http://"/utf8>>}), {ok, Parsed4} = gleam@uri:parse(<<"http://"/utf8>>), gleam@should:equal(gleam@uri:origin(Parsed4), {ok, <<"http://"/utf8>>}), {ok, Parsed5} = gleam@uri:parse(<<"/path"/utf8>>), gleam@should:equal(gleam@uri:origin(Parsed5), {error, nil}), {ok, Parsed6} = gleam@uri:parse(<<"file:///dev/null"/utf8>>), gleam@should:equal(gleam@uri:origin(Parsed6), {error, nil}). merge_test() -> {ok, A} = gleam@uri:parse(<<"/relative"/utf8>>), {ok, B} = gleam@uri:parse(<<""/utf8>>), gleam@should:equal(gleam@uri:merge(A, B), {error, nil}), {ok, A1} = gleam@uri:parse(<<"http://google.com/foo"/utf8>>), {ok, B1} = gleam@uri:parse(<<"http://example.com/baz"/utf8>>), gleam@should:equal( gleam@uri:merge(A1, B1), gleam@uri:parse(<<"http://example.com/baz"/utf8>>) ), {ok, A2} = gleam@uri:parse(<<"http://google.com/foo"/utf8>>), {ok, B2} = gleam@uri:parse(<<"http://example.com/.././bar/../../baz"/utf8>>), gleam@should:equal( gleam@uri:merge(A2, B2), gleam@uri:parse(<<"http://example.com/baz"/utf8>>) ), {ok, A3} = gleam@uri:parse(<<"http://google.com/foo"/utf8>>), {ok, B3} = gleam@uri:parse(<<"//example.com/baz"/utf8>>), gleam@should:equal( gleam@uri:merge(A3, B3), gleam@uri:parse(<<"http://example.com/baz"/utf8>>) ), {ok, A4} = gleam@uri:parse(<<"http://google.com/foo"/utf8>>), {ok, B4} = gleam@uri:parse(<<"//example.com/.././bar/../../../baz"/utf8>>), gleam@should:equal( gleam@uri:merge(A4, B4), gleam@uri:parse(<<"http://example.com/baz"/utf8>>) ), {ok, A5} = gleam@uri:parse(<<"http://example.com/foo/bar"/utf8>>), {ok, B5} = gleam@uri:parse(<<"/baz"/utf8>>), gleam@should:equal( gleam@uri:merge(A5, B5), gleam@uri:parse(<<"http://example.com/baz"/utf8>>) ), {ok, A6} = gleam@uri:parse(<<"http://example.com/foo/bar"/utf8>>), {ok, B6} = gleam@uri:parse(<<"baz"/utf8>>), gleam@should:equal( gleam@uri:merge(A6, B6), gleam@uri:parse(<<"http://example.com/foo/baz"/utf8>>) ), {ok, A7} = gleam@uri:parse(<<"http://example.com/foo/"/utf8>>), {ok, B7} = gleam@uri:parse(<<"baz"/utf8>>), gleam@should:equal( gleam@uri:merge(A7, B7), gleam@uri:parse(<<"http://example.com/foo/baz"/utf8>>) ), {ok, A8} = gleam@uri:parse(<<"http://example.com"/utf8>>), {ok, B8} = gleam@uri:parse(<<"baz"/utf8>>), gleam@should:equal( gleam@uri:merge(A8, B8), gleam@uri:parse(<<"http://example.com/baz"/utf8>>) ), {ok, A9} = gleam@uri:parse(<<"http://example.com"/utf8>>), {ok, B9} = gleam@uri:parse(<<"/.././bar/../../../baz"/utf8>>), gleam@should:equal( gleam@uri:merge(A9, B9), gleam@uri:parse(<<"http://example.com/baz"/utf8>>) ), {ok, A10} = gleam@uri:parse(<<"http://example.com/foo/bar"/utf8>>), {ok, B10} = gleam@uri:parse(<<""/utf8>>), gleam@should:equal( gleam@uri:merge(A10, B10), gleam@uri:parse(<<"http://example.com/foo/bar"/utf8>>) ), {ok, A11} = gleam@uri:parse(<<"http://example.com/foo/bar"/utf8>>), {ok, B11} = gleam@uri:parse(<<"#fragment"/utf8>>), gleam@should:equal( gleam@uri:merge(A11, B11), gleam@uri:parse(<<"http://example.com/foo/bar#fragment"/utf8>>) ), {ok, A12} = gleam@uri:parse(<<"http://example.com/foo/bar"/utf8>>), {ok, B12} = gleam@uri:parse(<<"?query"/utf8>>), gleam@should:equal( gleam@uri:merge(A12, B12), gleam@uri:parse(<<"http://example.com/foo/bar?query"/utf8>>) ), {ok, A13} = gleam@uri:parse(<<"http://example.com/foo/bar?query1"/utf8>>), {ok, B13} = gleam@uri:parse(<<"?query2"/utf8>>), gleam@should:equal( gleam@uri:merge(A13, B13), gleam@uri:parse(<<"http://example.com/foo/bar?query2"/utf8>>) ), {ok, A14} = gleam@uri:parse(<<"http://example.com/foo/bar?query"/utf8>>), {ok, B14} = gleam@uri:parse(<<""/utf8>>), gleam@should:equal( gleam@uri:merge(A14, B14), gleam@uri:parse(<<"http://example.com/foo/bar?query"/utf8>>) ).