schema_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Copyright 2015 Google Inc. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package bigquery
  15. import (
  16. "reflect"
  17. "testing"
  18. bq "google.golang.org/api/bigquery/v2"
  19. )
  20. func bqTableFieldSchema(desc, name, typ, mode string) *bq.TableFieldSchema {
  21. return &bq.TableFieldSchema{
  22. Description: desc,
  23. Name: name,
  24. Mode: mode,
  25. Type: typ,
  26. }
  27. }
  28. func fieldSchema(desc, name, typ string, repeated, required bool) *FieldSchema {
  29. return &FieldSchema{
  30. Description: desc,
  31. Name: name,
  32. Repeated: repeated,
  33. Required: required,
  34. Type: FieldType(typ),
  35. }
  36. }
  37. func TestSchemaConversion(t *testing.T) {
  38. testCases := []struct {
  39. schema Schema
  40. bqSchema *bq.TableSchema
  41. }{
  42. {
  43. // required
  44. bqSchema: &bq.TableSchema{
  45. Fields: []*bq.TableFieldSchema{
  46. bqTableFieldSchema("desc", "name", "STRING", "REQUIRED"),
  47. },
  48. },
  49. schema: Schema{
  50. fieldSchema("desc", "name", "STRING", false, true),
  51. },
  52. },
  53. {
  54. // repeated
  55. bqSchema: &bq.TableSchema{
  56. Fields: []*bq.TableFieldSchema{
  57. bqTableFieldSchema("desc", "name", "STRING", "REPEATED"),
  58. },
  59. },
  60. schema: Schema{
  61. fieldSchema("desc", "name", "STRING", true, false),
  62. },
  63. },
  64. {
  65. // nullable, string
  66. bqSchema: &bq.TableSchema{
  67. Fields: []*bq.TableFieldSchema{
  68. bqTableFieldSchema("desc", "name", "STRING", ""),
  69. },
  70. },
  71. schema: Schema{
  72. fieldSchema("desc", "name", "STRING", false, false),
  73. },
  74. },
  75. {
  76. // integer
  77. bqSchema: &bq.TableSchema{
  78. Fields: []*bq.TableFieldSchema{
  79. bqTableFieldSchema("desc", "name", "INTEGER", ""),
  80. },
  81. },
  82. schema: Schema{
  83. fieldSchema("desc", "name", "INTEGER", false, false),
  84. },
  85. },
  86. {
  87. // float
  88. bqSchema: &bq.TableSchema{
  89. Fields: []*bq.TableFieldSchema{
  90. bqTableFieldSchema("desc", "name", "FLOAT", ""),
  91. },
  92. },
  93. schema: Schema{
  94. fieldSchema("desc", "name", "FLOAT", false, false),
  95. },
  96. },
  97. {
  98. // boolean
  99. bqSchema: &bq.TableSchema{
  100. Fields: []*bq.TableFieldSchema{
  101. bqTableFieldSchema("desc", "name", "BOOLEAN", ""),
  102. },
  103. },
  104. schema: Schema{
  105. fieldSchema("desc", "name", "BOOLEAN", false, false),
  106. },
  107. },
  108. {
  109. // timestamp
  110. bqSchema: &bq.TableSchema{
  111. Fields: []*bq.TableFieldSchema{
  112. bqTableFieldSchema("desc", "name", "TIMESTAMP", ""),
  113. },
  114. },
  115. schema: Schema{
  116. fieldSchema("desc", "name", "TIMESTAMP", false, false),
  117. },
  118. },
  119. {
  120. // nested
  121. bqSchema: &bq.TableSchema{
  122. Fields: []*bq.TableFieldSchema{
  123. &bq.TableFieldSchema{
  124. Description: "An outer schema wrapping a nested schema",
  125. Name: "outer",
  126. Mode: "REQUIRED",
  127. Type: "RECORD",
  128. Fields: []*bq.TableFieldSchema{
  129. bqTableFieldSchema("inner field", "inner", "STRING", ""),
  130. },
  131. },
  132. },
  133. },
  134. schema: Schema{
  135. &FieldSchema{
  136. Description: "An outer schema wrapping a nested schema",
  137. Name: "outer",
  138. Required: true,
  139. Type: "RECORD",
  140. Schema: []*FieldSchema{
  141. &FieldSchema{
  142. Description: "inner field",
  143. Name: "inner",
  144. Type: "STRING",
  145. },
  146. },
  147. },
  148. },
  149. },
  150. }
  151. for _, tc := range testCases {
  152. bqSchema := tc.schema.asTableSchema()
  153. if !reflect.DeepEqual(bqSchema, tc.bqSchema) {
  154. t.Errorf("converting to TableSchema: got:\n%v\nwant:\n%v", bqSchema, tc.bqSchema)
  155. }
  156. schema := convertTableSchema(tc.bqSchema)
  157. if !reflect.DeepEqual(schema, tc.schema) {
  158. t.Errorf("converting to Schema: got:\n%v\nwant:\n%v", schema, tc.schema)
  159. }
  160. }
  161. }