242 lines
10 KiB
Python
242 lines
10 KiB
Python
import json
|
|
|
|
from odoo import http
|
|
|
|
from odoo.tests.common import HttpCase, new_test_user
|
|
from odoo.tools.misc import mute_logger
|
|
|
|
from .common import SpreadsheetTestCommon
|
|
|
|
|
|
class TestSpreadsheetDocumentController(SpreadsheetTestCommon, HttpCase):
|
|
|
|
def test_upload_osheet_json_file(self):
|
|
self.authenticate('admin', 'admin')
|
|
folder = self.env['documents.document'].create({'name': 'Test folder', 'type': 'folder', 'access_internal': 'edit'})
|
|
|
|
data = {'sheets': []}
|
|
|
|
for name in ['test.osheet.json', 'test.osheet (5).json', 'test.osheet(5).json']:
|
|
with self.subTest(name=name):
|
|
response = self.url_open(
|
|
url='/documents/upload',
|
|
data={
|
|
'access_token': folder.access_token,
|
|
'csrf_token': http.Request.csrf_token(self),
|
|
},
|
|
files=[('ufile', (name, json.dumps(data), 'application/json'))],
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
document = self.env['documents.document'].browse(response.json())
|
|
self.assertEqual(document.handler, 'spreadsheet')
|
|
self.assertEqual(document.spreadsheet_data, json.dumps(data))
|
|
|
|
def test_upload_osheet_not_json_file(self):
|
|
self.authenticate('admin', 'admin')
|
|
folder = self.env['documents.document'].create({'name': 'Test folder', 'type': 'folder', 'access_internal': 'edit'})
|
|
data = 'not a json file'
|
|
response = self.url_open(
|
|
url='/documents/upload',
|
|
data={
|
|
'access_token': folder.access_token,
|
|
'csrf_token': http.Request.csrf_token(self),
|
|
},
|
|
files=[('ufile', ('test.osheet.json', data, 'text/plain'))],
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
document = self.env['documents.document'].browse(response.json())
|
|
self.assertFalse(document.handler)
|
|
self.assertFalse(document.spreadsheet_data)
|
|
self.assertEqual(document.folder_id, folder)
|
|
|
|
@mute_logger('odoo.http')
|
|
def test_upload_invalid_osheet_json_file(self):
|
|
self.authenticate('admin', 'admin')
|
|
folder = self.env['documents.document'].create({'name': 'Test folder', 'type': 'folder', 'access_internal': 'edit'})
|
|
data = {
|
|
'sheets': [],
|
|
'lists': {
|
|
'1': {
|
|
'model': 'my.invalid.model',
|
|
'columns': [],
|
|
'domain': [],
|
|
'context': {},
|
|
'orderBy': [],
|
|
'id': '1',
|
|
'name': 'Purchase Orders by Untaxed Amount'
|
|
}
|
|
}
|
|
}
|
|
response = self.url_open(
|
|
url='/documents/upload',
|
|
data={
|
|
'access_token': folder.access_token,
|
|
'csrf_token': http.Request.csrf_token(self),
|
|
},
|
|
files=[('ufile', ('test.osheet.json', json.dumps(data), 'application/json'))],
|
|
)
|
|
|
|
self.assertIn('Looks like the spreadsheet file contains invalid data.', response.text)
|
|
self.assertEqual(response.status_code, 422)
|
|
|
|
def test_get_blank_spreadsheet_data(self):
|
|
self.authenticate(self.spreadsheet_user.login, self.spreadsheet_user.password)
|
|
spreadsheet = self.create_spreadsheet()
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s' % spreadsheet.id)
|
|
self.assertEqual(response.status_code, 200)
|
|
result = response.json()
|
|
self.assertEqual(result['data'], {})
|
|
self.assertEqual(result['revisions'], [], 'It should not have past revisions')
|
|
|
|
def test_get_active_spreadsheet_data(self):
|
|
self.authenticate(self.spreadsheet_user.login, self.spreadsheet_user.password)
|
|
spreadsheet = self.create_spreadsheet()
|
|
commands = self.new_revision_data(spreadsheet)
|
|
spreadsheet.dispatch_spreadsheet_message(commands)
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s' % spreadsheet.id)
|
|
self.assertEqual(response.status_code, 200)
|
|
result = response.json()
|
|
del commands['clientId']
|
|
self.assertEqual(result['data'], {})
|
|
self.assertEqual(result['revisions'], [commands], 'It should have past revisions')
|
|
|
|
def test_read_internal_user_access(self):
|
|
raoul = new_test_user(self.env, login='raoul')
|
|
self.authenticate(raoul.login, raoul.password)
|
|
document = self.env['documents.document'].create(
|
|
{
|
|
'spreadsheet_data': b'{}',
|
|
'folder_id': self.folder.id,
|
|
'handler': 'spreadsheet',
|
|
'mimetype': 'application/o-spreadsheet',
|
|
'access_internal': 'edit',
|
|
}
|
|
)
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s' % document.id)
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.json()['isReadonly'], False)
|
|
self.assertEqual(response.json()['data'], {})
|
|
|
|
@mute_logger('odoo.http')
|
|
def test_get_data_with_token(self):
|
|
document = self.create_spreadsheet()
|
|
|
|
document.access_via_link = 'view'
|
|
document.access_internal = 'none'
|
|
document.folder_id.access_via_link = 'none'
|
|
document.folder_id.access_internal = 'none'
|
|
access_token = document.sudo().access_token
|
|
|
|
raoul = new_test_user(self.env, login='raoul')
|
|
alice = new_test_user(self.env, login='alice')
|
|
|
|
self.env['documents.access'].create({
|
|
'document_id': document.id,
|
|
'partner_id': raoul.partner_id.id,
|
|
'role': 'edit',
|
|
})
|
|
|
|
self.authenticate(alice.login, alice.password) # readonly access with token
|
|
# without token
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s' % document.id)
|
|
self.assertEqual(response.status_code, 403, 'Forbidden')
|
|
|
|
# with wrong token
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s/a-wrong-token' % document.id)
|
|
self.assertEqual(response.status_code, 403, 'Forbidden')
|
|
|
|
# with token
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s/%s' % (document.id, access_token))
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.json()['isReadonly'], True)
|
|
|
|
# without token and access
|
|
self.authenticate('raoul', 'raoul') # explicit edit access
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s' % (document.id,))
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.json()['isReadonly'], False)
|
|
|
|
# with token and access
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s/%s' % (document.id, access_token))
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.json()['isReadonly'], False)
|
|
|
|
@mute_logger('odoo.http')
|
|
def test_get_readonly_data_with_token(self):
|
|
'Readonly access'
|
|
document = self.create_spreadsheet()
|
|
|
|
document.access_via_link = 'view'
|
|
document.access_internal = 'none'
|
|
document.folder_id.access_via_link = 'none'
|
|
document.folder_id.access_internal = 'none'
|
|
|
|
access_token = document.sudo().access_token
|
|
|
|
raoul = new_test_user(self.env, login='raoul')
|
|
self.authenticate(raoul.login, raoul.password)
|
|
# without token
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s' % document.id)
|
|
self.assertEqual(response.status_code, 403, 'Forbidden')
|
|
|
|
# with token
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s/%s' % (document.id, access_token))
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.json()['isReadonly'], True)
|
|
|
|
def test_spreadsheet_with_token_from_folder_share(self):
|
|
document_1 = self.create_spreadsheet()
|
|
self.create_spreadsheet()
|
|
folder = document_1.folder_id
|
|
self.assertEqual(len(folder.children_ids), 2, 'there are more than one document in the folder')
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s' % document_1.id)
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
def test_read_portal_user_with_doc_access(self):
|
|
document = self.create_spreadsheet()
|
|
portal_user = new_test_user(self.env, login="Raoul", groups="base.group_portal")
|
|
self.authenticate(portal_user.login, portal_user.password)
|
|
self.env['documents.access'].create({
|
|
'document_id': document.id,
|
|
'partner_id': portal_user.partner_id.id,
|
|
'role': 'view',
|
|
})
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s' % document.id)
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
def test_join_snapshot_request(self):
|
|
raoul = new_test_user(self.env, login='raoul')
|
|
self.authenticate(raoul.login, raoul.password)
|
|
spreadsheet = self.create_spreadsheet()
|
|
with self._freeze_time('2020-02-02 18:00'):
|
|
spreadsheet.dispatch_spreadsheet_message(
|
|
self.new_revision_data(spreadsheet)
|
|
)
|
|
spreadsheet.access_internal = 'view'
|
|
with self._freeze_time('2020-02-03 18:00'):
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s' % spreadsheet.id)
|
|
# readonly
|
|
self.assertFalse(
|
|
response.json().get('snapshot_requested'),
|
|
'It should not have requested a snapshot',
|
|
)
|
|
# edit
|
|
spreadsheet.access_internal = 'edit'
|
|
self.folder.access_internal = 'edit'
|
|
self.assertTrue(spreadsheet._should_be_snapshotted())
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s' % spreadsheet.id)
|
|
self.assertTrue(
|
|
response.json().get('snapshot_requested'),
|
|
'It should have requested a snapshot',
|
|
)
|
|
|
|
def test_spreadsheet_name_is_a_string(self):
|
|
self.authenticate(self.spreadsheet_user.login, self.spreadsheet_user.password)
|
|
spreadsheet = self.create_spreadsheet(name='')
|
|
self.assertEqual(spreadsheet.name, '')
|
|
self.assertFalse(spreadsheet.display_name)
|
|
response = self.url_open('/spreadsheet/data/documents.document/%s' % spreadsheet.id)
|
|
self.assertEqual(response.json()['name'], '')
|