Validate contact specs against schema #2660

This commit is contained in:
Martin Lensment 2015-06-01 17:07:02 +03:00
parent 1e9426ce7b
commit 257fd619ae
4 changed files with 221 additions and 35 deletions

View file

@ -12,6 +12,7 @@
-->
<import namespace="urn:ietf:params:xml:ns:eppcom-1.0" schemaLocation="doc/schemas/eppcom-1.0.xsd"/>
<import namespace="urn:ietf:params:xml:ns:epp-1.0" schemaLocation="doc/schemas/epp-1.0.xsd"/>
<import namespace="urn:ietf:params:xml:ns:eis-1.0" schemaLocation="doc/schemas/eis-1.0.xsd"/>
<annotation>
<documentation>
@ -94,7 +95,7 @@
-->
<complexType name="createType">
<sequence>
<element name="id" type="eppcom:clIDType"/>
<element name="id" type="eppcom:clIDType" minOccurs="0"/>
<element name="postalInfo" type="contact:postalInfoType"
maxOccurs="2"/>
<element name="voice" type="contact:e164Type"
@ -103,10 +104,9 @@
minOccurs="0"/>
<element name="email" type="eppcom:minTokenType"/>
<element name="ident" type="contact:identType"
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType"/>
<element name="disclose" type="contact:discloseType"
minOccurs="0"/>
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType" minOccurs="0"/>
</sequence>
</complexType>
@ -117,8 +117,7 @@
minOccurs="0"/>
<element name="addr" type="contact:addrType"/>
</sequence>
<attribute name="type" type="contact:postalInfoEnumType"
use="required"/>
<attribute name="type" type="contact:postalInfoEnumType"/>
</complexType>
<simpleType name="postalInfoEnumType">
@ -148,21 +147,6 @@
</choice>
</complexType>
<complexType name="discloseType">
<sequence>
<element name="name" type="contact:intLocType"
minOccurs="0" maxOccurs="2"/>
<element name="org" type="contact:intLocType"
minOccurs="0" maxOccurs="2"/>
<element name="addr" type="contact:intLocType"
minOccurs="0" maxOccurs="2"/>
<element name="voice" minOccurs="0"/>
<element name="fax" minOccurs="0"/>
<element name="email" minOccurs="0"/>
</sequence>
<attribute name="flag" type="boolean" use="required"/>
</complexType>
<complexType name="intLocType">
<attribute name="type" type="contact:postalInfoEnumType"
use="required"/>
@ -240,8 +224,6 @@
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType"
minOccurs="0"/>
<element name="disclose" type="contact:discloseType"
minOccurs="0"/>
</sequence>
</complexType>
@ -331,8 +313,6 @@
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType"
minOccurs="0"/>
<element name="disclose" type="contact:discloseType"
minOccurs="0"/>
</sequence>
</complexType>

View file

@ -26,8 +26,8 @@
<sequence>
<element name="legalDocument" type="eis:legalDocType"
minOccurs="0" maxOccurs="1"/>
<!-- <element name="ident" type="eis:identType"
minOccurs="0" maxOccurs="1"/> -->
<element name="ident" type="eis:identType"
minOccurs="0" maxOccurs="1"/>
</sequence>
</complexType>
@ -55,10 +55,11 @@
</restriction>
</simpleType>
<!-- <complexType name="identType">
<complexType name="identType">
<simpleContent>
<extension base="normalizedString">
<attribute name="type" type="eis:identEnumType" use="required"/>
<attribute name="cc" type="eis:ccType" use="required"/>
</extension>
</simpleContent>
</complexType>
@ -70,5 +71,12 @@
<enumeration value="birthday"/>
<enumeration value="passport"/>
</restriction>
</simpleType> -->
</simpleType>
<simpleType name="ccType">
<restriction base="normalizedString">
<minLength value="2"/>
<maxLength value="2"/>
</restriction>
</simpleType>
</schema>

View file

@ -2,6 +2,7 @@ require 'rails_helper'
describe 'EPP Contact', epp: true do
before :all do
@xsd = Nokogiri::XML::Schema(File.read('doc/schemas/contact-1.0.xsd'))
@registrar1 = Fabricate(:registrar1)
@registrar2 = Fabricate(:registrar2)
@epp_xml = EppXml::Contact.new(cl_trid: 'ABC-12345')
@ -15,7 +16,7 @@ describe 'EPP Contact', epp: true do
@extension = {
legalDocument: {
value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==',
value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
},
ident: {
@ -31,8 +32,10 @@ describe 'EPP Contact', epp: true do
extension = @extension if extension.blank?
defaults = {
id: nil,
postalInfo: {
name: { value: 'John Doe' },
org: nil,
addr: {
street: { value: '123 Example' },
city: { value: 'Tallinn' },
@ -48,7 +51,7 @@ describe 'EPP Contact', epp: true do
end
it 'fails if request xml is missing' do
response = epp_plain_request(@epp_xml.create, :xml)
response = epp_plain_request(@epp_xml.create, validate_input: false)
response[:results][0][:msg].should ==
'Required parameter missing: create > create > postalInfo > name [name]'
response[:results][1][:msg].should ==
@ -103,7 +106,7 @@ describe 'EPP Contact', epp: true do
it 'successfully saves ident type' do
extension = {
legalDocument: {
value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==',
value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
},
ident: {
@ -205,7 +208,7 @@ describe 'EPP Contact', epp: true do
end
it 'should generate server id when id is empty' do
response = create_request({ id: { value: '' } })
response = create_request({ id: nil })
response[:msg].should == 'Command completed successfully'
response[:result_code].should == '1000'
@ -381,7 +384,7 @@ describe 'EPP Contact', epp: true do
it 'should update ident' do
extension = {
legalDocument: {
value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==',
value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
},
ident: {

195
t Normal file
View file

@ -0,0 +1,195 @@
diff --git a/doc/schemas/contact-1.0.xsd b/doc/schemas/contact-1.0.xsd
index dc2b366..9fa665a 100644
--- a/doc/schemas/contact-1.0.xsd
+++ b/doc/schemas/contact-1.0.xsd
@@ -12,6 +12,7 @@
-->
<import namespace="urn:ietf:params:xml:ns:eppcom-1.0" schemaLocation="doc/schemas/eppcom-1.0.xsd"/>
<import namespace="urn:ietf:params:xml:ns:epp-1.0" schemaLocation="doc/schemas/epp-1.0.xsd"/>
+ <import namespace="urn:ietf:params:xml:ns:eis-1.0" schemaLocation="doc/schemas/eis-1.0.xsd"/> 

<annotation>
<documentation>
@@ -94,7 +95,7 @@
-->
<complexType name="createType">
<sequence>
- <element name="id" type="eppcom:clIDType"/>
+ <element name="id" type="eppcom:clIDType" minOccurs="0"/> 
<element name="postalInfo" type="contact:postalInfoType"
maxOccurs="2"/>
<element name="voice" type="contact:e164Type"
@@ -103,10 +104,9 @@
minOccurs="0"/>
<element name="email" type="eppcom:minTokenType"/>
<element name="ident" type="contact:identType"
- minOccurs="0"/> 
- <element name="authInfo" type="contact:authInfoType"/>
- <element name="disclose" type="contact:discloseType"
- minOccurs="0"/>
+ minOccurs="0"/> 
+ <element name="authInfo" type="contact:authInfoType" minOccurs="0"/> 
+ 
</sequence>
</complexType>

@@ -117,8 +117,7 @@
minOccurs="0"/>
<element name="addr" type="contact:addrType"/>
</sequence>
- <attribute name="type" type="contact:postalInfoEnumType"
- use="required"/>
+ <attribute name="type" type="contact:postalInfoEnumType"/> 
</complexType>

<simpleType name="postalInfoEnumType">
@@ -148,21 +147,6 @@
</choice>
</complexType>

- <complexType name="discloseType">
- <sequence>
- <element name="name" type="contact:intLocType"
- minOccurs="0" maxOccurs="2"/>
- <element name="org" type="contact:intLocType"
- minOccurs="0" maxOccurs="2"/>
- <element name="addr" type="contact:intLocType"
- minOccurs="0" maxOccurs="2"/>
- <element name="voice" minOccurs="0"/>
- <element name="fax" minOccurs="0"/>
- <element name="email" minOccurs="0"/>
- </sequence>
- <attribute name="flag" type="boolean" use="required"/>
- </complexType>
-
<complexType name="intLocType">
<attribute name="type" type="contact:postalInfoEnumType"
use="required"/>
@@ -240,8 +224,6 @@
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType"
minOccurs="0"/>
- <element name="disclose" type="contact:discloseType"
- minOccurs="0"/>
</sequence>
</complexType>

@@ -331,8 +313,6 @@
minOccurs="0"/>
<element name="authInfo" type="contact:authInfoType"
minOccurs="0"/>
- <element name="disclose" type="contact:discloseType"
- minOccurs="0"/>
</sequence>
</complexType>

diff --git a/doc/schemas/eis-1.0.xsd b/doc/schemas/eis-1.0.xsd
index 390c455..98a73ca 100644
--- a/doc/schemas/eis-1.0.xsd
+++ b/doc/schemas/eis-1.0.xsd
@@ -26,8 +26,8 @@
<sequence>
<element name="legalDocument" type="eis:legalDocType"
minOccurs="0" maxOccurs="1"/>
-<!-- <element name="ident" type="eis:identType"
- minOccurs="0" maxOccurs="1"/> -->
+ <element name="ident" type="eis:identType"
+ minOccurs="0" maxOccurs="1"/>
</sequence>
</complexType>

@@ -55,10 +55,11 @@
</restriction>
</simpleType>

- <!-- <complexType name="identType">
+ <complexType name="identType">
<simpleContent>
<extension base="normalizedString">
<attribute name="type" type="eis:identEnumType" use="required"/>
+ <attribute name="cc" type="eis:ccType" use="required"/>
</extension>
</simpleContent>
</complexType>
@@ -70,5 +71,12 @@
<enumeration value="birthday"/>
<enumeration value="passport"/>
</restriction>
- </simpleType> -->
+ </simpleType>
+
+ <simpleType name="ccType">
+ <restriction base="normalizedString">
+ <minLength value="2"/>
+ <maxLength value="2"/>
+ </restriction>
+ </simpleType>
</schema>
diff --git a/spec/epp/contact_spec.rb b/spec/epp/contact_spec.rb
index 02540e1..c576808 100644
--- a/spec/epp/contact_spec.rb
+++ b/spec/epp/contact_spec.rb
@@ -2,6 +2,7 @@ require 'rails_helper'

describe 'EPP Contact', epp: true do
before :all do
+ @xsd = Nokogiri::XML::Schema(File.read('doc/schemas/contact-1.0.xsd'))
@registrar1 = Fabricate(:registrar1)
@registrar2 = Fabricate(:registrar2)
@epp_xml = EppXml::Contact.new(cl_trid: 'ABC-12345')
@@ -15,7 +16,7 @@ describe 'EPP Contact', epp: true do

@extension = {
legalDocument: {
- value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==',
+ value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
},
ident: {
@@ -31,8 +32,10 @@ describe 'EPP Contact', epp: true do
extension = @extension if extension.blank?

defaults = {
+ id: nil,
postalInfo: {
name: { value: 'John Doe' },
+ org: nil,
addr: {
street: { value: '123 Example' },
city: { value: 'Tallinn' },
@@ -48,7 +51,7 @@ describe 'EPP Contact', epp: true do
end

it 'fails if request xml is missing' do
- response = epp_plain_request(@epp_xml.create, :xml)
+ response = epp_plain_request(@epp_xml.create, validate_input: false)
response[:results][0][:msg].should ==
'Required parameter missing: create > create > postalInfo > name [name]'
response[:results][1][:msg].should ==
@@ -103,7 +106,7 @@ describe 'EPP Contact', epp: true do
it 'successfully saves ident type' do
extension = {
legalDocument: {
- value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==',
+ value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
},
ident: {
@@ -205,7 +208,7 @@ describe 'EPP Contact', epp: true do
end

it 'should generate server id when id is empty' do
- response = create_request({ id: { value: '' } })
+ response = create_request({ id: nil })

response[:msg].should == 'Command completed successfully'
response[:result_code].should == '1000'
@@ -381,7 +384,7 @@ describe 'EPP Contact', epp: true do
it 'should update ident' do
extension = {
legalDocument: {
- value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==',
+ value: 'dGVzdCBmYWlsCg==',
attrs: { type: 'pdf' }
},
ident: {