<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
-->
<Module>
  <ModulePrefs title="EndToEndTest"/>
  <Content type="html">
    <![CDATA[
      <script type="text/javascript" src="/testframework.js"></script>
      <script type="text/javascript">
        var tests = {
          /** Test fetching a makeRequest proxied call */
          fetchMakeRequest: function() {
            function receivedData(response) {
              assertEquals('Text property not set', '{"key": "value"}', response.text);
              assertEquals('Data property not set', '{"key": "value"}', response.data);
              assertEquals('Response code not set', 200, response.rc);
              assertEquals('Errors not an empty array', 0, response.errors.length);
              finished();
            }

            gadgets.io.makeRequest('http://localhost:9003/test.json', receivedData);
          },

          /** Test fetching a makeRequest proxied for JSON */
          fetchMakeRequestJson: function() {
            function receivedData(response) {
              assertEquals('Text property not set', '{"key": "value"}', response.text);
              assertEquals('Data property not set', 'value', response.data.key);
              assertEquals('Response code not set', 200, response.rc);
              assertEquals('Errors not an empty array', 0, response.errors.length);
              finished();
            }

            gadgets.io.makeRequest('http://localhost:9003/test.json', receivedData,
              {CONTENT_TYPE: 'JSON'});
          },

          /** Test fetching a makeRequest proxied call that fails */
          fetchMakeRequestJson: function() {
            function receivedData(response) {
              assertEquals('Response code not set', 404, response.rc);
              assertEquals('Errors not an empty array', 1, response.errors.length);
              finished();
            }

            gadgets.io.makeRequest('http://localhost:9003/doesntexist.txt', receivedData);
          }
        };
      </script>
    ]]>
  </Content>
</Module>
