// Copyright 2022 Google LLC
//
// Licensed 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
//
//     https://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.

syntax = "proto3";

import "google/api/routing.proto";
import "google/protobuf/empty.proto";

package google.explicit.dynamic.routing.header;

option java_package = "com.google.explicit.dynamic.routing.header";
option java_multiple_files = true;

// This service is only meant for unit testing RoutingRuleParser
service RoutingRuleParserTesting {

  // Test case for no routing rule found
  rpc NoRoutingRuleTest(NoRoutingRuleTestRequest) returns (google.protobuf.Empty) {

  }

  // Test case for empty path template
  rpc EmptyPathTemplateTest(EmptyPathTemplateTestRequest) returns (google.protobuf.Empty) {
    option (google.api.routing) = {
      routing_parameters {
        field: "name"
      }
    };
  }

  // Test case for path template has zero named segment
  rpc ZeroSegmentPathTemplateTest(ZeroSegmentPathTemplateTestRequest) returns (google.protobuf.Empty) {
    option (google.api.routing) = {
      routing_parameters {
        field: "name"
        path_template: "/v1beta1/tests/*"
      }
    };
  }

  // Test case for path template has more than one named segment
  rpc MultipleSegmentsPathTemplateTest(MultipleSegmentsPathTemplateTestRequest) returns (google.protobuf.Empty) {
    option (google.api.routing) = {
      routing_parameters {
        field: "name"
        path_template: "/v1beta1/{name=tests/*}/{second_name=*}"
      }
    };
  }

  // Test case for happy path
  rpc HappyPathTest(HappyPathTestRequest) returns (google.protobuf.Empty) {
    option (google.api.routing) = {
      routing_parameters {
        field: "name"
        path_template: "/v1beta1/{rename=tests/*}"
      }
    };
  }

  // Test case for happy path with multiple routing parameters
  rpc MultipleRoutingParamsHappyPathTest(MultipleRoutingParamsHappyPathTestReqest) returns (google.protobuf.Empty) {
    option (google.api.routing) = {
      routing_parameters {
        field: "name"
        path_template: "/v1beta1/{rename=tests/*}"
      }
      routing_parameters {
        field: "routing_id"
        path_template: "/v1beta1/{id=projects/*}/tables/*"
      }
    };
  }

  // Test case for happy path with nested fields
  rpc NestedFieldsHappyPathTest(NestedFieldsHappyPathTestRequest) returns (google.protobuf.Empty) {
    option (google.api.routing) = {
      routing_parameters {
        field: "account.name"
        path_template: "/v1beta1/{rename=tests/*}"
      }
    };
  }

  // Test case for field validation. We already have extensive unit tests for field validation, so only testing one simple case.
  rpc FieldDoesNotExistTest(FieldDoesNotExistTestRequest) returns (google.protobuf.Empty) {
    option (google.api.routing) = {
      routing_parameters {
        field: "does_not_exist"
        path_template: "/v1beta1/{rename=tests/*}"
      }
    };
  }

}

message NoRoutingRuleTestRequest {
}

message EmptyPathTemplateTestRequest {
  string name = 1;
}

message ZeroSegmentPathTemplateTestRequest {
  string name = 1;
}

message MultipleSegmentsPathTemplateTestRequest {
  string name = 1;
}

message HappyPathTestRequest {
  string name = 1;
}

message MultipleRoutingParamsHappyPathTestReqest {
  string name = 1;
  string routing_id = 2;
}

message NestedFieldsHappyPathTestRequest {
  Account account = 1;
}

message FieldDoesNotExistTestRequest {
  string name = 1;
}

message Account {
  string name = 1;
}

