/**
 * 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.
 */

import {Request} from "@angular/http";

import * as moment from 'moment';
import {Moment} from "moment";

import {
  clusters,
  hosts,
  services,
  users,
  components,
  levels,
  ucFirst,
  getRandomInt,
  getRandomElement,
  generatePath,
  generateServiceLog,
  generateAuditLog
} from './mock-data-common';

export const mockDataPost = {
  "login": {},
  "logout": {},

  "api/v1/shipper/[a-zA-Z0-9\\-]{1,}/services/[a-zA-Z0-9\\-]{1,}$": (query: any, request: Request) => {
    const body = request.getBody();
    return {};
  },
  ".*": {}
};
